Worker Thread 模式
Worker的意思是工作的人,劳动者。在Worker Thread模式中,工人线程(worker thread)会逐个取回工作并进行处理。当所有的工作全部完成之后,工人线程会等待新的工作到来。
Worker Thread模式也被称作为Background Thread(背景线程)模式。另外,如果从“保存多个工人线程的场所”这一点看,我们也可以称这种模式为Thread Pool(线程池)模式。
示例程序
下表列举了示例程序中的所有类。示例程序的行为如下。
ClientThread类的线程会向Channel类发送工作请求(委托)
Channel类的实例雇佣了五个工人线程(WorkerThread)进行工作。所有工人线程都在等待工作请求的到来。
工人的请求到来之后,工人线程会从Channel哪里获取一项工作请求并开始工作。工作完成后,工人线程会回到Channel哪里等待下一项工作请求。
类的一览表
名字 | 说明 |
---|---|
Main | 测试程序行为的类 |
ClientThread | 表示发出工作请求的线程的类 |
Request | 可以工作请求的类 |
Channel | 接收工作请求并将工作请求交给工人线程的类 |
WorkerThread | 表示工人线程的类 |
Main类
Main类会创建一个雇佣了五个工人线程的Channel实例,并将其共享给三个ClientThread(A、B、C)。
Main类
1 | public class Main { |
ClientThread类
ClientThread类是发送工作请求的类。“发送工作请求”这个行为对应的是示例程序中的以下处理
- 创建Request实例
- 将该实例传递给Channel类的putRequest方法
为了让程序行为有些变化,这里让程序sleep一段随机长的时间。
发送工作请求的ClientThread类
1 | import java.util.Random; |
Request类
Request类是表示工作请求的类。
name字段表示发送请求的委托者的名字,number字段表示请求的编号。在示例程序中,name的值是A、B、C之一,number的只是0,1,2,3.。execute方法是负责“处理”请求的方法。
表示工作请求的Request类
1 | import java.util.Random; |
Channel类
Channel类是负责传递工作请求以及保存工人线程的类。
为了传递工作请求,我们在Channel类中定义了requestQueue字段。该字段将扮演保存请求的队列的角色。putRequest方法用于将请求加入到队列中,takeRequest方法则用于取出队列中的请求。这里使用了Producer-Consumer模式。另外。为了实现putRequest方法和takeRequest方法,这里还使用了Guarded Suspension模式。
Channel勒种定义了一个用于保存工人线程的threadPool字段。threadPool是WorkerThread的数组。Channel类的构造函数会初始化threadPool字段并创建WorkerThread的实例。数组的大小由threads决定。
这里为工人线程赋予的名字分别为Worker-0,Worker-1,.。
startWorkers方法是用于启动所有工人线程的方法。
负责传递工作请求以及保存工人线程的Channel类
Channel类
1 | public class Channel { |
WorkerThread类
WorkerThread类表示工人线程的类。
工人线程会进行工作。“进行工作”这个处理对应示例程序中的以下处理。
- 调用takeRequest方法从Channel的实例中获取一个Request的实例
- 调用Request的实例的execute方法
工人线程一旦启动后就会一直工作。也就是说,它会一直执行“获取一个新的Request,然后调用它的execute方法”的处理。
表示工人线程的WorkerThread类
1 | public class WorkerThread extends Thread { |