執行緒定製排程,
阿新 • • 發佈:2018-11-15
需求:模擬3*10mi的接力賽,分別有三個執行緒,A , B,C 分別列印1 - 10 , 11 - 20 , 21 - 30 並且完成執行緒的順序交替列印。實現程式碼如下:
其實可以使用jon來實現,但是這樣做的效率並不是很高。
package hello_java; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Customize_Thread { public static void main(String[] args) { ShareData shareData = new ShareData(); new Thread(() -> { shareData.print10(); },"A").start(); new Thread(() -> { shareData.print20(); },"C").start(); new Thread(() -> { shareData.print30(); },"B").start(); } } class ShareData{ public int flag = 1; private Lock lock = new ReentrantLock(); private Condition condition1 = lock.newCondition(); private Condition condition2 = lock.newCondition(); private Condition condition3 = lock.newCondition(); public void print10(){ lock.lock(); try { while(flag != 1){ condition1.await(); } for (int i = 1; i <= 10; i++) { System.out.println(i); } flag = 2; condition2.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void print20(){ lock.lock(); try { while(flag != 2){ condition2.await(); } for (int i = 11; i <= 20; i++) { System.out.println(i); } flag = 3; condition3.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void print30(){ lock.lock(); try { while(flag != 3){ condition3.await(); } for (int i = 21; i <= 30; i++) { System.out.println(i); } flag = 3; condition1.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } }
執行結果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Process finished with exit code 0