250
技術社區[雲棲]
最精簡的java 線程池與任務隊列
import java.util.*; public class WorkQueue { private final int nThreads;// 線程池的大小 private final PoolWorker[] threads;// 用數組實現線程池 private final LinkedList queue;// 任務隊列 public WorkQueue(int nThreads) { this.nThreads = nThreads; queue = new LinkedList(); threads = new PoolWorker[nThreads]; for (int i = 0; i < nThreads; i++) { threads[i] = new PoolWorker(); threads[i].start();// 啟動所有工作線程 } } public void execute(Runnable r) {// 執行任務 synchronized (queue) { queue.addLast(r); queue.notify(); } } private class PoolWorker extends Thread {// 工作線程類 public void run() { Runnable r; while (true) { synchronized (queue) { while (queue.isEmpty()) {// 如果任務隊列中沒有任務,等待 try { queue.wait(); } catch (InterruptedException ignored) { } } r = (Runnable) queue.removeFirst();// 有任務時,取出任務 } try { r.run();// 執行任務 } catch (RuntimeException e) { // You might want to log something here } } } } public static void main(String args[]) { WorkQueue wq = new WorkQueue(10);// 10個工作線程 Mytask r[] = new Mytask[20];// 20個任務 for (int i = 0; i < 20; i++) { r[i] = new Mytask(); wq.execute(r[i]); } } } class Mytask implements Runnable {// 任務接口 public void run() { String name = Thread.currentThread().getName(); try { Thread.sleep(100);// 模擬任務執行的時間 } catch (InterruptedException e) { } System.out.println(name + " executed OK"); } }
最後更新:2017-04-03 18:52:13