`

java worker thread模式

阅读更多

转两个帖子

一个java worker thread例子http://blog.csdn.net/derekjiang/article/details/5204090

另一个java worker thread的讲解http://blog.csdn.net/derekjiang/article/details/5204090

 

 

Worker Thread Pattern的参与者:

1. Client(委托人)参与者

    Client参与者会建立Request参与者,并传给Channel参与者。

2. Channel(通路)参与者

    Channel参与者会从Client参与者获取Request参与者,传递给Worker参与者。

3. Worker(工人)参与者

    Worker参与者会从Channel参与者获取Request参与者,并执行这份工作。当工作结束之后,会去拿下一个Request参与者。

4. Request(请求)参与者

    Reqeust参与者用来表示工作。Request参与者会存放执行这份工作所需要的数据。

---------------------------------------------

控制承载量:

Worker参与者的数量是可以自由设置的。提高Worker参与者的数量,可以提高并发处理的工作量。但是如果准备的Worker参与者数量比同时间的工作量来的多,有些Worker参与者也派不上用场,没活干,还会占用内存。所以有必要配合实际软件使用的需要来调整Worker参与者的数量。

---------------------------------------------

Invocation与execution的分离:

Client参与者会发出工作请求,工作的内容以Request的形式包装起来,传递个Channel参与者。这个过程,对应于普通的方法调用来说,就相当于“评估自变量,启动方法”的操作。

另一方面,Worker参与者会使用从Channel参与者拿来的Request参与者,进行实际的操作。这个过程,对应于普通的方法调用来说,可以对应到“执行方法”的部分。

普通的方法调用的操作,“启动方法”和“执行方法”是连续进行的。当一个方法一经调用,就会马上继续执行,启动和执行是密不可分的。

在Worker Thread Pattern中,实现了“启动方法”和“执行方法”的分离。这样的好处有:

1. 提高响应性。

invocation可以继续自己前进,不用等待execution,这样能提高程序的响应性。

2. 控制实行顺序。

invocation和execution分离,execute的顺序就可以与invoke的次序无关,也就是说,我们可以对Request参与者设立优先级,控制Channel参与者传递Request给Worker参与者的顺序。

3. 可以取消和重复执行。

如果能将invocation和execution分离,那么就能做到在execute之前,把已经invoke的请求的execution取消掉。

同样,只要把Request参与者保存下来,就可以重复执行。

4. 分散处理的第一步

因为invocation和execution分离了,所以invoke和execute的操作也比较容易拆开在不同的计算机上面执行,相当于Reqeust参与者的对象,可以通过网络传送的另外一台计算机上。

------------------------------------------------

多态的Request参与者:

因为WorkerThread参与者只不过是单纯的接收Request的实例,调用Request的execute方法,

那么当我们建立Request类的子类,并将其传递给Channel,WorkerThread也应该能够正确的处理。

执行工作所需要的所有信息,都定义在Request参与者里。所以即使建立出多态的Request参与者,增加工作的种类,Channel参与者和Worker参与者都不需要进行任何修改。

------------------------------------------

实例:

Java代码  收藏代码
  1. public class Request {  
  2.     private final String name; //  委托者  
  3.     private final int number;  // 请求编号  
  4.     private static final Random random = new Random();  
  5.     public Request(String name, int number) {  
  6.         this.name = name;  
  7.         this.number = number;  
  8.     }  
  9.     public void execute() {  
  10.         System.out.println(Thread.currentThread().getName() + " executes " + this);  
  11.         try {  
  12.             Thread.sleep(random.nextInt(1000));  
  13.         } catch (InterruptedException e) {  
  14.         }  
  15.     }  
  16.     public String toString() {  
  17.         return "[ Request from " + name + " No." + number + " ]";  
  18.     }  
  19. }  

 

 

 

Java代码  收藏代码
  1. public class ClientThread extends Thread {  
  2.     private final Channel channel;  
  3.     private static final Random random = new Random();  
  4.     public ClientThread(String name, Channel channel) {  
  5.         super(name);  
  6.         this.channel = channel;  
  7.     }  
  8.     public void run() {  
  9.         try {  
  10.             for (int i = 0true; i++) {  
  11.                 Request request = new Request(getName(), i);  
  12.                 channel.putRequest(request);  
  13.                 Thread.sleep(random.nextInt(1000));  
  14.             }  
  15.         } catch (InterruptedException e) {  
  16.         }  
  17.     }  
  18. }  

 

 

 

Java代码  收藏代码
  1. public class WorkerThread extends Thread {  
  2.     private final Channel channel;  
  3.     public WorkerThread(String name, Channel channel) {  
  4.         super(name);  
  5.         this.channel = channel;  
  6.     }  
  7.     public void run() {  
  8.         while (true) {  
  9.             Request request = channel.takeRequest();  
  10.             request.execute();  
  11.         }  
  12.     }  
  13. }  

 

 

Java代码  收藏代码
  1. public class Channel {  
  2.     private static final int MAX_REQUEST = 100;  
  3.     private final Request[] requestQueue;  
  4.     private int tail;  // 下一个putRequest的地方  
  5.     private int head;  // 下一个takeRequest的地方  
  6.     private int count; // Request的数量  
  7.   
  8.     private final WorkerThread[] threadPool;  
  9.   
  10.     public Channel(int threads) {  
  11.         this.requestQueue = new Request[MAX_REQUEST];  
  12.         this.head = 0;  
  13.         this.tail = 0;  
  14.         this.count = 0;  
  15.   
  16.         threadPool = new WorkerThread[threads];  
  17.         for (int i = 0; i < threadPool.length; i++) {  
  18.             threadPool[i] = new WorkerThread("Worker-" + i, this);  
  19.         }  
  20.     }  
  21.     public void startWorkers() {  
  22.         for (int i = 0; i < threadPool.length; i++) {  
  23.             threadPool[i].start();  
  24.         }  
  25.     }  
  26.     public synchronized void putRequest(Request request) {  
  27.         while (count >= requestQueue.length) {  
  28.             try {  
  29.                 wait();  
  30.             } catch (InterruptedException e) {  
  31.             }  
  32.         }  
  33.         requestQueue[tail] = request;  
  34.         tail = (tail + 1) % requestQueue.length;  
  35.         count++;  
  36.         notifyAll();  
  37.     }  
  38.     public synchronized Request takeRequest() {  
  39.         while (count <= 0) {  
  40.             try {  
  41.                 wait();  
  42.             } catch (InterruptedException e) {  
  43.             }  
  44.         }  
  45.         Request request = requestQueue[head];  
  46.         head = (head + 1) % requestQueue.length;  
  47.         count--;  
  48.         notifyAll();  
  49.         return request;  
  50.     }  
  51. }  

 

 

Java代码  收藏代码
  1. public class Main {  
  2.     public static void main(String[] args) {  
  3.         Channel channel = new Channel(5);   // 工人线程的數量  
  4.         channel.startWorkers();  
  5.         new ClientThread("Alice", channel).start();  
  6.         new ClientThread("Bobby", channel).start();  
  7.         new ClientThread("Chris", channel).start();  
  8.     }  
  9. }  
分享到:
评论

相关推荐

    java 子线程通过观察者模式通知主线程

    WorkerThread worker = new WorkerThread(); MainThread main = new MainThread(worker); new Thread(worker).start(); // 启动子线程 } } ``` 在这个例子中,`WorkerThread`类是`Observable`的实例,它在完成...

    java多线程设计模式详解(PDF及源码)

    去睡觉吧 第11章 Thread-Specific Storage——每个线程的保管箱 第12章 Active Object——接受异步消息的主动对象 总结 多线程程序设计的模式语言 附录A 练习问题的解答 附录B Java的内存模型 附录C Java线程的...

    java多线程设计模式 (PDF中文版, 附源码)

    第8章 Worker Thread——等到工作来,来了就工作 第9章 Future——先给您这张提货单 第10章 Two-Phase Termination——快把玩具收拾好,去睡觉吧 第11章 Thread-Specific Storage——每个线程的保管箱 第12章 Active...

    Java线程池及观察者模式解决多线程意外死亡重启问题

    class WorkerThread extends Thread implements Observer { @Override public void run() { try { // 执行任务 } catch (Exception e) { // 捕获异常并处理,比如记录日志 update(ObservableEvent.THREAD_...

    java多线程设计模式源码

    1. **线程池(ThreadPool)**:在`WorkerThread`系列中,我们可以看到线程池的设计。线程池是管理线程资源的有效方式,通过预先创建一定数量的线程,避免频繁地创建和销毁线程导致的性能损耗。线程池可以根据任务...

    java多线程设计模式

    - 在多线程编程中,Worker Pattern 是一种常见的设计模式,通常用于处理任务队列。 - 一个或多个 Worker 线程不断检查任务队列,一旦发现新任务,就立即处理。 - 这种模式常用于服务器应用程序,如网络服务,因为...

    Java 2 Java 2

    6. **Swing Worker**:为了解决GUI线程(Event Dispatch Thread,EDT)阻塞问题,SWING引入了Swing Worker,可以在后台线程执行耗时任务,保证界面的响应性。 总之,Java 2作为一个重要的Java平台版本,其强大的...

    Java多线程详解

    Java多线程模式详解 目录: 一、漫谈UML Java语言的线程 多线程的评量标准 二、 1、Single Threaded Execution ———— 能通过这座桥的,只有一个人 2、Immutable ———— 想破坏它也没办法 3、Guarded ...

    java中界面控件的使用

    6. **线程处理**:为了防止UI冻结,数据库操作通常在后台线程(也称为Worker Thread)中进行。Java提供了SwingWorker类,用于在后台执行耗时操作,并在完成时更新UI。 7. **设计模式**:在构建"studentapp"时,我们...

    Java简单记事本源码

    7. **线程管理**:为了防止阻塞UI,I/O操作通常在后台线程(非GUI线程,也称为Worker Thread)中执行。Java提供了SwingWorker类,它可以异步执行耗时任务并更新GUI。 8. **异常处理**:在文件操作中,可能出现各种...

    详细剖析JAVA多线程案例教学

    Runnable worker = new WorkerThread(i); executor.execute(worker); // 执行任务 } executor.shutdown(); // 关闭线程池 while (!executor.isTerminated()) { } ``` #### 四、总结 Java多线程编程不仅...

    Java/Android回调机制小示例

    在编程领域,回调机制是一种常见的设计模式,尤其在Java和Android开发中被广泛使用。回调允许我们定义一种在特定事件发生时执行的代码块,它能够帮助实现异步操作的处理,提高程序的灵活性和可扩展性。在这个“Java/...

    java多线程.pdf

    线程设计模式包括Master-Worker模式、Producer-Consumer模式等,这些模式定义了多线程环境下任务执行和资源分配的标准方式。Master-Worker模式中,Master线程负责分配任务,Worker线程负责执行任务;Producer-...

    java界面编程-中级界面篇

    12. **Swing Worker线程**:为了在界面线程(Event Dispatch Thread,EDT)之外执行耗时操作,避免界面冻结,可以使用Swing Worker。它能确保更新界面的操作在EDT中执行。 通过学习和实践这些Java界面编程的知识点...

    线程回调demo

    在Java编程语言中,线程回调是一种常见的设计模式,它允许一个线程在完成特定任务后通知另一个线程。在Android开发中,由于主线程(UI线程)不能执行耗时操作,回调机制尤为重要,因为它可以帮助我们保持界面的响应...

    java编写的GUI简单socket聊天源码小程序

    3. **多线程**:在GUI应用程序中,为了保持界面的响应性,通常需要将耗时的操作(如读写Socket)放在单独的线程中执行,这称为后台线程或worker thread。Java中的`Thread`类和`Runnable`接口可用于创建和管理这些...

    gdk_workerclient

    4. **设计模式**:`Worker`模式可能被实现为Java中的`Observer`、`Producer-Consumer`或者`Executor`模式,以有效地处理并发任务和数据流。 5. **事件驱动编程**:如果`gdk_workerclient`使用了事件驱动模型,那么...

    swing不确定进度条

    在Java编程环境中,Swing库提供了丰富的组件用于创建图形用户界面(GUI)。在GUI应用程序中,当执行耗时操作如文件读写、网络通信或大数据处理时,为了提高用户体验,通常会使用进度条(JProgressBar)来显示任务的...

    JavaOmok:JavaStudy1-Omok

    WorkerThread thread = new WorkerThread(() -&gt; System.out.println("Thread finished.")); thread.start(); ``` 在"JavaOmok-master"这个压缩包中,可能包含的是一个关于以上知识点的示例代码库,供学习者实践和...

    RectiveX-android

    为了App不卡顿,我们会把所有耗时的操作(比如:网络访问、文件访问)放到Worker Thread中。但是Android本身的AsyncTask的设计个人觉得设计的十分糟糕,不但写出来的代码冗长,而且稍微复杂一些的多流操作就会写的...

Global site tag (gtag.js) - Google Analytics