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
次到了,不需要任何執行緒等待了,就把等待全部設定成喚醒。否則會導致程式一直不結束。
相關文章
- 【Java】【多執行緒】兩個執行緒間的通訊、wait、notify、notifyAllJava執行緒AI
- 如何讓兩個執行緒交替列印數字執行緒
- Java 執行緒常用操作Java執行緒
- java多執行緒5:執行緒間的通訊Java執行緒
- AA BB CC AA執行緒列印 ,CC執行緒列印執行緒
- 三個執行緒迴圈列印123-多執行緒執行緒
- 【java】【多執行緒】建立執行緒的兩種常用方式(2)Java執行緒
- Java執行緒的CPU時間片Java執行緒
- java多執行緒間的通訊Java執行緒
- 手撕Java多執行緒(四)執行緒之間的協作Java執行緒
- java--執行緒池--建立執行緒池的幾種方式與執行緒池操作詳解Java執行緒
- 什麼?一個核同時執行兩個執行緒?執行緒
- 三個執行緒輪流列印 1-100執行緒
- 執行緒、開啟執行緒的兩種方式、執行緒下的Join方法、守護執行緒執行緒
- 說說Java執行緒間通訊Java執行緒
- 執行緒的基本操作:新建和終止執行緒執行緒
- Java執行緒篇——執行緒的開啟Java執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- 多執行緒操作執行緒
- Java多執行緒-執行緒中止Java執行緒
- 關於MySql 設定一個間隔時間 執行一個事件MySql事件
- 多執行緒的執行緒狀態及相關操作執行緒
- MyBatis列印SQL執行時間MyBatisSQL
- Java-執行緒間通訊小結Java執行緒
- java多執行緒之執行緒的基本使用Java執行緒
- 【Java】【多執行緒】執行緒的生命週期Java執行緒
- 曹工雜談:一道阿里面試題,兩個執行緒交替列印奇偶數阿里面試題執行緒
- Android小知識-Java多執行緒相關(執行緒間通訊)上篇AndroidJava執行緒
- java多執行緒:執行緒間通訊——生產者消費者模型Java執行緒模型
- Java多執行緒之執行緒中止Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- java多執行緒9:執行緒池Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- java執行緒執行緒休眠,sleep方法Java執行緒