在线程中执行任务
串行地执行任务
1 | //串行的Web服务器 |
显式地为任务创建线程
1 | 在Web服务器中为每个请求启动一个新的线程(不要这样做) |
- 任务处理过程从主线程中分离出来,使得主循环能够更快地重新等待下一个到来的连接。这使得程序在完成前面的请求之前可以接受新的请求,从而提高响应性。
- 任务可以并行处理,从而能够同时服务多个请求。
- 任务处理代码必须是线程安全的,因为当有多个任务时会并发地调用这段代码。
1 | //串行的Web服务器 |
1 | 在Web服务器中为每个请求启动一个新的线程(不要这样做) |
Java平台类库包含了丰富的并发基础构建模块,例如线程安全的容器类以及各种用于协调多个相互协作的线程控制流的同步工具类(Synchronizer
)。
同步容器类包括Vector
和HashTable
,还包括由Collections.synchronizedXxx
等工厂方法创建的封装器类。同步容器类可以简单地理解为通过synchronized
来实现同步的容器。这些类实现线程安全的方式是:将它们的状态封装起来,并对每个公有方法都进行同步,使得每次只有一个线程能访问容器的状态。
同步容器类都是线程安全的,但在某些情况下可能需要额外的客户端加锁来保护复合操作。容器上常见的复合操作包括:迭代、跳转以及条件运算。在同步容器类中,这些复合操作在没有客户端加锁的情况下仍然是线程安全的,但当其他线程并发地修改容器时,它们可能会表现出意料之外的行为。
ThreadLocal
提供了线程的局部变量,每个线程都可以通过set()
和get()
来对这个局部变量进行操作,但不会和其他线程的局部变量进行冲突,实现了线程的数据隔离。
1 | public class Main { |
首先需要创建一个线程共享的ThreadLocal
对象,该对象用于存储Integer
类型的值,然后在每条线程中调用以下方法操作ThreadLocal
:
set(obj)
:向当前线程中存储数据get()
:获取当前线程中的数据remove()
:删除当前线程中的数据泛型实现了参数化类型的概念。
根据泛型应用的不同,可分为:
泛型类
1 | class ClassParameter<T> { |
泛型接口
1 | interface InterfaceParameter<T> { |
泛型方法
1 | class MethodParameter { |