Worker Thread模式在Request的管理上像是 Producer Consumer 模式,在Request的行為上像是 Command 模式。
Producer Consumer模式專注於Product的生產與消費,至於Product被消費時是作何處理,則不在它的討論範圍之中。
如果您的Product是一個Request,消費者取得Request之後,執行Request中指定的請求方法,也就是使用Command模式,並且您的Request緩衝區還管理了Consumer,就有Worker Thread模式的意思了。
在Sequence Diagram上,可以看出Worker Thread同時展現了Producer Consumer模式與Command模式:
利用Java實現的一個Channel類如下所示:
import java.util.LinkedList;
public class Channel { private LinkedList requests; private WorkerThread[] workerThreads;
public Channel(int threadNumber) { requests = new LinkedList(); workerThreads = new WorkerThread[threadNumber]; for(int i = 0; i < workerThreads.size(); i++) { workerThreads[i] = new WorkerThread(this); workerThreads[i].start(); } }
public synchronized void putRequest(Request request) { while(requests.size() >= 2) { // 容量限制為 2 try { wait(); } catch(InterruptedException e) {} }
requests.addLast(request); notifyAll(); } public synchronized Request getProduct() { while(requests.size() <= 0) { try { wait(); } catch(InterruptedException e) {} }
Request request = (Request) requests.removeFirst(); notifyAll(); return request; } }
Request類與WorkerThread類之間採的Command模式:
public class Request() { // ....
public void execute() { // do some work.... } }
public class WorkerThread extends Thread { private Channel channel;
public WorkerThread(Channel channel) { this.channel = channel; }
// ...
public void run() { while(true) { Request request = channel.getRequest(); request.execute(); ... } } }
就行為上,WorkerThread就是有請求來了就作,如果沒有請求,則所有的WorkerThread就等待,直到有新的工作進來而通知它們,取得請
求的WorkerThread要作的工作,就直接定義在execute()中。
如果您使用的是Swing,則可以參考一下 Using a Swing Worker Thread,了解一下如何在Swing中執行背景程式的方式。
|