08_01_线程池的使用

线程池的使用

一、默认线程池的弊端

并非所有任务都能适用于默认的执行策略,比如:

  • 依赖性任务
  • 线程封闭的任务
  • 长时间运行的任务
  • 使用线程本地变量的任务

这类任务往往需要指定特定的执行策略,否则可能会产生活跃性问题。

 07_05_程序关闭

程序关闭

JVM 既可以正常关闭,也可以强行关闭。

正常关闭方式有:

  • 最后一个“正常(非守护)”线程结束时
  • 调用了 System.exit() 方法
  • 通过其他特定于平台的方法(比如发送 SIGNAL 信号,或键入 CRTL + C)

 07_04_服务停止

服务停止

应用程序中通常会创建拥有多个线程的服务,比如线程池。

一般来说,服务的生命周期基本都比线程的生命周期要长。

当要停止服务时,服务拥有的这些线程也需要同时结束,所以服务应该要提供相应的生命周期方法,比如 shutdown()shutdownNow() 这样的。

 07_03_中断响应

中断响应

在取消任务和中断线程中,中断都起到了很大作用:

  • 取消任务,最合理的方式就是使用中断
  • 中断线程,线程收到中断后作何处理

但是有个问题:

  • 任务和线程都能接收中断请求,那怎么区分?

也就是,中断响应由谁来负责?

 06_任务的执行

任务的执行

一、在线程中执行任务

1.1 串行执行

串行执行,是指所有任务都在单个线程中串行地执行。

1
2
3
4
5
6
7
8
9
class SingleThreadWebServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(80);
while (true) {
Socket connection = serverSocket.accept();
handleRequest(connection);
}
}
}

串行执行,一般来说吞吐率或速响应性都比较差。

 05_基础构建模块

基础构建模块

一、同步容器

  • 同步容器类都是线程安全的,比如 Vector 和 HashTable
  • 实现线程安全的方式是:将它们的状态都封装起来,所有对外接口都是同步方法
  • 对容器状态的访问都串行化,保证每次只有一个线程访问容器
  • 能保证单个操作是线程安全的,但是复合操作是不能保证线程安全的
  • 常见的不安全的复合操作包括:迭代、跳转、条件运算

 04_对象的组合

对象的组合

一、设计线程安全的类

1.1 设计过程

1.1.1 收集对象状态

  • 收集类对象的所有状态
  • 如果对象中引用了其他对象,那么该对象的状态也包括引用对象的状态
  • 如果发布了某个可变对象的引用,那么就不应该算作对象的状态