java 兩個執行緒間隔列印1,2一共100次的騷操作
package com.pycat.sample.print;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* Created by cat on 2018/6/26.
* print number
* --- split print number 1,2 in two different thread
*/
public class PrintNumber {
private final ReentrantReadWriteLock.WriteLock mLock;
private final Condition condition1;
private final Condition condition2;
public PrintNumber() {
this.mLock = new ReentrantReadWriteLock().writeLock();
condition1 = mLock.newCondition();
condition2 = mLock.newCondition();
}
private AtomicInteger count = new AtomicInteger(0);
public void print1() {
while (count.get() < 100) {
try {
mLock.lock();
System.out.println(Thread.currentThread().getName() + ":" + 1 + " " + count);
count.set(count.get() + 1);
condition2.signalAll();
condition1.await();
} catch (Exception e) {
e.printStackTrace();
} finally {
mLock.unlock();
}
}
System.out.println("end PRINT 111111111111111111111");
mLock.lock();
condition2.signalAll();
condition1.signalAll();
mLock.unlock();
}
public void print2() {
while (count.get() < 100) {
try {
mLock.lock();
System.out.println(Thread.currentThread().getName() + ":" + 2 + " xxx " + count);
count.set(count.get() + 1);
condition1.signalAll();
condition2.await();
} catch (Exception e) {
e.printStackTrace();
} finally {
mLock.unlock();
}
}
System.out.println("end PRINT 222222222222222222222222");
mLock.lock();
condition1.signalAll();
condition2.signalAll();
mLock.unlock();
}
}
呼叫:
package com.pycat.sample;
import com.pycat.sample.print.PrintNumber;
public class Main {
public static void main(String[] args) {
// write your code here
System.out.println("hello world");
PrintNumber number = new PrintNumber();
new Thread(number::print1).start();
new Thread(number::print2).start();
}
}
大體實現就是這樣吧,反正思路就是:1列印了一次後,立即喚醒2,並讓自己等待;2和1邏輯相同。
然後需要注意一個細節就是最後,100
次到了,不需要任何執行緒等待了,就把等待全部設定成喚醒。否則會導致程式一直不結束。
相關文章
- JS 的間隔執行緒JS執行緒
- 【Java】【多執行緒】兩個執行緒間的通訊、wait、notify、notifyAllJava執行緒AI
- 如何讓兩個執行緒交替列印數字執行緒
- 三個執行緒輪流列印 1-100執行緒
- 簡單的執行緒同步問題:兩個執行緒交替執行N次【Synchronized、Lock、ArrayBlockingQueue】執行緒synchronizedBloC
- Java多執行緒——獲取多個執行緒任務執行完的時間Java執行緒
- AA BB CC AA執行緒列印 ,CC執行緒列印執行緒
- Java 執行緒常用操作Java執行緒
- java多執行緒5:執行緒間的通訊Java執行緒
- 【java】【多執行緒】建立執行緒的兩種常用方式(2)Java執行緒
- java執行緒建立的兩種方式Java執行緒
- 100行Java程式碼構建一個執行緒池Java執行緒
- 三個執行緒迴圈列印123-多執行緒執行緒
- java多執行緒間的通訊Java執行緒
- Java執行緒的CPU時間片Java執行緒
- Java多執行緒/併發05、synchronized應用例項:執行緒間操作共享資料Java執行緒synchronized
- Java 多執行緒的一次整理Java執行緒
- 手撕Java多執行緒(四)執行緒之間的協作Java執行緒
- 什麼?一個核同時執行兩個執行緒?執行緒
- java--執行緒池--建立執行緒池的幾種方式與執行緒池操作詳解Java執行緒
- 定義JOB的執行間隔
- 請教:java的子執行緒和主控執行緒之間的關係?Java執行緒
- 徹底明白Java的多執行緒-執行緒間的通訊(2)(轉)Java執行緒
- 徹底明白Java的多執行緒-執行緒間的通訊(1)(轉)Java執行緒
- 執行緒操作執行緒
- 執行緒、開啟執行緒的兩種方式、執行緒下的Join方法、守護執行緒執行緒
- Java執行緒安全實現懶初始化兩個方式Java執行緒
- .NET多執行緒操作需要考慮的兩大因素執行緒
- mysql比較兩個日期間隔MySql
- 如何計算兩個時間間隔的天數
- SQL datediff用法( 返回兩個日期之間的間隔)SQL
- Java多執行緒——執行緒Java執行緒
- Java面試題:如果你這樣做,你會後悔的,兩次啟動同一個執行緒~~~Java面試題執行緒
- Java執行緒的5個使用技巧Java執行緒
- 說說Java執行緒間通訊Java執行緒
- 多執行緒100執行緒
- 執行緒的基本操作:新建和終止執行緒執行緒
- Java執行緒篇——執行緒的開啟Java執行緒