Worker Pattern(二)

xiaoxiao2026-08-15  33

终于到了真正的WorkerThread,这是真正执行任务的服务器线程: package com.crackj2ee.thread; public class WorkerThread extends Thread { private static int count = 0; private boolean busy = false; private boolean stop = false; private TaskQueue queue; public WorkerThread(ThreadGroup group, TaskQueue queue) { super(group, "worker-" + count); count++; this.queue = queue; } public void shutdown() { stop = true; this.interrupt(); try { this.join(); } catch(InterruptedException ie) {} } public boolean isIdle() { return !busy; } public void run() { System.out.println(getName() + " start."); while(!stop) { Task task = queue.getTask(); if(task!=null) { busy = true; task.execute(); busy = false; } } System.out.println(getName() + " end."); } } 前面已经讲过,queue.getTask()是一个阻塞方法,服务器线程可能在此wait()一段时间。此外,WorkerThread还有一个shutdown方法,用于安全结束线程。 最后是ThreadPool,负责管理所有的服务器线程,还可以动态增加和减少线程数: package com.crackj2ee.thread; import java.util.*; public class ThreadPool extends ThreadGroup { private List threads = new LinkedList(); private TaskQueue queue; public ThreadPool(TaskQueue queue) { super("Thread-Pool"); this.queue = queue; } public synchronized void addWorkerThread() { Thread t = new WorkerThread(this, queue); threads.add(t); t.start(); } public synchronized void removeWorkerThread() { if(threads.size()>0) { WorkerThread t = (WorkerThread)threads.remove(0); t.shutdown(); } } public synchronized void currentStatus() { System.out.println("-----------------------------------------------"); System.out.println("Thread count = " + threads.size()); Iterator it = threads.iterator(); while(it.hasNext()) { WorkerThread t = (WorkerThread)it.next(); System.out.println(t.getName() + ": " + (t.isIdle() ? "idle" : "busy")); } System.out.println("-----------------------------------------------"); } } currentStatus()方法是为了方便调试,打印出所有线程的当前状态。
转载请注明原文地址: https://www.6miu.com/read-5051254.html

最新回复(0)