转两个帖子
一个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参与者都不需要进行任何修改。
------------------------------------------
实例:
- public class Request {
- private final String name; // 委托者
- private final int number; // 请求编号
- private static final Random random = new Random();
- public Request(String name, int number) {
- this.name = name;
- this.number = number;
- }
- public void execute() {
- System.out.println(Thread.currentThread().getName() + " executes " + this);
- try {
- Thread.sleep(random.nextInt(1000));
- } catch (InterruptedException e) {
- }
- }
- public String toString() {
- return "[ Request from " + name + " No." + number + " ]";
- }
- }
- public class ClientThread extends Thread {
- private final Channel channel;
- private static final Random random = new Random();
- public ClientThread(String name, Channel channel) {
- super(name);
- this.channel = channel;
- }
- public void run() {
- try {
- for (int i = 0; true; i++) {
- Request request = new Request(getName(), i);
- channel.putRequest(request);
- Thread.sleep(random.nextInt(1000));
- }
- } catch (InterruptedException e) {
- }
- }
- }
- public class WorkerThread extends Thread {
- private final Channel channel;
- public WorkerThread(String name, Channel channel) {
- super(name);
- this.channel = channel;
- }
- public void run() {
- while (true) {
- Request request = channel.takeRequest();
- request.execute();
- }
- }
- }
- public class Channel {
- private static final int MAX_REQUEST = 100;
- private final Request[] requestQueue;
- private int tail; // 下一个putRequest的地方
- private int head; // 下一个takeRequest的地方
- private int count; // Request的数量
- private final WorkerThread[] threadPool;
- public Channel(int threads) {
- this.requestQueue = new Request[MAX_REQUEST];
- this.head = 0;
- this.tail = 0;
- this.count = 0;
- threadPool = new WorkerThread[threads];
- for (int i = 0; i < threadPool.length; i++) {
- threadPool[i] = new WorkerThread("Worker-" + i, this);
- }
- }
- public void startWorkers() {
- for (int i = 0; i < threadPool.length; i++) {
- threadPool[i].start();
- }
- }
- public synchronized void putRequest(Request request) {
- while (count >= requestQueue.length) {
- try {
- wait();
- } catch (InterruptedException e) {
- }
- }
- requestQueue[tail] = request;
- tail = (tail + 1) % requestQueue.length;
- count++;
- notifyAll();
- }
- public synchronized Request takeRequest() {
- while (count <= 0) {
- try {
- wait();
- } catch (InterruptedException e) {
- }
- }
- Request request = requestQueue[head];
- head = (head + 1) % requestQueue.length;
- count--;
- notifyAll();
- return request;
- }
- }
- public class Main {
- public static void main(String[] args) {
- Channel channel = new Channel(5); // 工人线程的數量
- channel.startWorkers();
- new ClientThread("Alice", channel).start();
- new ClientThread("Bobby", channel).start();
- new ClientThread("Chris", channel).start();
- }
- }
相关推荐
WorkerThread worker = new WorkerThread(); MainThread main = new MainThread(worker); new Thread(worker).start(); // 启动子线程 } } ``` 在这个例子中,`WorkerThread`类是`Observable`的实例,它在完成...
去睡觉吧 第11章 Thread-Specific Storage——每个线程的保管箱 第12章 Active Object——接受异步消息的主动对象 总结 多线程程序设计的模式语言 附录A 练习问题的解答 附录B Java的内存模型 附录C Java线程的...
第8章 Worker Thread——等到工作来,来了就工作 第9章 Future——先给您这张提货单 第10章 Two-Phase Termination——快把玩具收拾好,去睡觉吧 第11章 Thread-Specific Storage——每个线程的保管箱 第12章 Active...
class WorkerThread extends Thread implements Observer { @Override public void run() { try { // 执行任务 } catch (Exception e) { // 捕获异常并处理,比如记录日志 update(ObservableEvent.THREAD_...
1. **线程池(ThreadPool)**:在`WorkerThread`系列中,我们可以看到线程池的设计。线程池是管理线程资源的有效方式,通过预先创建一定数量的线程,避免频繁地创建和销毁线程导致的性能损耗。线程池可以根据任务...
- 在多线程编程中,Worker Pattern 是一种常见的设计模式,通常用于处理任务队列。 - 一个或多个 Worker 线程不断检查任务队列,一旦发现新任务,就立即处理。 - 这种模式常用于服务器应用程序,如网络服务,因为...
6. **Swing Worker**:为了解决GUI线程(Event Dispatch Thread,EDT)阻塞问题,SWING引入了Swing Worker,可以在后台线程执行耗时任务,保证界面的响应性。 总之,Java 2作为一个重要的Java平台版本,其强大的...
Java多线程模式详解 目录: 一、漫谈UML Java语言的线程 多线程的评量标准 二、 1、Single Threaded Execution ———— 能通过这座桥的,只有一个人 2、Immutable ———— 想破坏它也没办法 3、Guarded ...
6. **线程处理**:为了防止UI冻结,数据库操作通常在后台线程(也称为Worker Thread)中进行。Java提供了SwingWorker类,用于在后台执行耗时操作,并在完成时更新UI。 7. **设计模式**:在构建"studentapp"时,我们...
7. **线程管理**:为了防止阻塞UI,I/O操作通常在后台线程(非GUI线程,也称为Worker Thread)中执行。Java提供了SwingWorker类,它可以异步执行耗时任务并更新GUI。 8. **异常处理**:在文件操作中,可能出现各种...
Runnable worker = new WorkerThread(i); executor.execute(worker); // 执行任务 } executor.shutdown(); // 关闭线程池 while (!executor.isTerminated()) { } ``` #### 四、总结 Java多线程编程不仅...
在编程领域,回调机制是一种常见的设计模式,尤其在Java和Android开发中被广泛使用。回调允许我们定义一种在特定事件发生时执行的代码块,它能够帮助实现异步操作的处理,提高程序的灵活性和可扩展性。在这个“Java/...
线程设计模式包括Master-Worker模式、Producer-Consumer模式等,这些模式定义了多线程环境下任务执行和资源分配的标准方式。Master-Worker模式中,Master线程负责分配任务,Worker线程负责执行任务;Producer-...
12. **Swing Worker线程**:为了在界面线程(Event Dispatch Thread,EDT)之外执行耗时操作,避免界面冻结,可以使用Swing Worker。它能确保更新界面的操作在EDT中执行。 通过学习和实践这些Java界面编程的知识点...
在Java编程语言中,线程回调是一种常见的设计模式,它允许一个线程在完成特定任务后通知另一个线程。在Android开发中,由于主线程(UI线程)不能执行耗时操作,回调机制尤为重要,因为它可以帮助我们保持界面的响应...
3. **多线程**:在GUI应用程序中,为了保持界面的响应性,通常需要将耗时的操作(如读写Socket)放在单独的线程中执行,这称为后台线程或worker thread。Java中的`Thread`类和`Runnable`接口可用于创建和管理这些...
4. **设计模式**:`Worker`模式可能被实现为Java中的`Observer`、`Producer-Consumer`或者`Executor`模式,以有效地处理并发任务和数据流。 5. **事件驱动编程**:如果`gdk_workerclient`使用了事件驱动模型,那么...
在Java编程环境中,Swing库提供了丰富的组件用于创建图形用户界面(GUI)。在GUI应用程序中,当执行耗时操作如文件读写、网络通信或大数据处理时,为了提高用户体验,通常会使用进度条(JProgressBar)来显示任务的...
WorkerThread thread = new WorkerThread(() -> System.out.println("Thread finished.")); thread.start(); ``` 在"JavaOmok-master"这个压缩包中,可能包含的是一个关于以上知识点的示例代码库,供学习者实践和...
为了App不卡顿,我们会把所有耗时的操作(比如:网络访问、文件访问)放到Worker Thread中。但是Android本身的AsyncTask的设计个人觉得设计的十分糟糕,不但写出来的代码冗长,而且稍微复杂一些的多流操作就会写的...