前言:
下面的代碼是參考網址:http://love3400wind.blog.163.com/blog/static/796308012013117102941831/ , http://blog.csdn.net/liu251/article/details/6227763 做了一點點的改動。
感謝兩位作者!
題目:
有A,B,C三個線程, A線程輸出A, B線程輸出B, C線程輸出C
要求, 同時啟動三個線程, 按順序輸出ABC, 循環10次
核心要素:
1,工作線程對象之間的關聯。
2,工作線程的狀態修改(前一個線程對象有能力修改后一個線程對象的狀態)。
示例:
package org.wit.ff.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * * @author F.Fang * */ public class ABCDemo { private Lock lock = new ReentrantLock();// 通過JDK5中的鎖來保證線程的訪問的互斥 private Condition condition = lock.newCondition();// 線程協作 public static void main(String[] args) { ABCDemo abc = new ABCDemo(); // 使用循環可以不局限於只有3個線程 交替, 任意多個都可以. PrintThread a = abc.new PrintThread("A", true); PrintThread b = abc.new PrintThread("B", false); PrintThread c = abc.new PrintThread("C", false); a.setNext(b); b.setNext(c); c.setNext(a); ExecutorService executor = Executors.newFixedThreadPool(3);// 通過線程池執行 for (int i = 0; i < 3; i++) { executor.execute(a); executor.execute(b); executor.execute(c); } executor.shutdown();//關閉線程池 } class PrintThread implements Runnable { private String name; private PrintThread next; private boolean execute; public PrintThread(String name, boolean execute) { this.name = name; this.execute = execute; } public PrintThread(String name, PrintThread next, boolean execute) { this.name = name; this.next = next; this.execute = execute; } public void run() { lock.lock(); try { while (true) { if (execute) { // 執行當前業務 print(); // 當前任務執行完成后 改變執行狀態為false execute = false; // 將下一個相鄰任務狀態設置為true next.setExecute(true); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } // 通知其它任務. condition.signalAll(); break; } else { try { // 若非執行狀態 即等待. condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } } } finally { lock.unlock(); } } public void print() { System.out.println(name); } public void setExecute(boolean execute) { this.execute = execute; } public void setNext(PrintThread next) { this.next = next; } } }