虽然徒手撸了好几遍了,但以后长时间不看的话跟没学有什么区别。
记录一下代码,以后时不时可以回顾一下。
package com.qjb;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class ShareResource
{
private int number = 1; //1:A 2:B 3:C
private Lock lock = new ReentrantLock();
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();
public void print5()
{
lock.lock();
try {
//1. 判断
while (number != 1)
{
condition1.await();
}
//2. 干活
System.out.println(Thread.currentThread().getName()+"\t"+ Thread.currentThread().getId()+"\t");
//3. 通知
number = 2;
condition2.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void print10()
{
lock.lock();
try {
//1. 判断
while (number != 2)
{
condition2.await();
}
//2. 干活
System.out.println(Thread.currentThread().getName()+"\t"+ Thread.currentThread().getId()+"\t");
//3. 通知
number = 3;
condition3.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void print15()
{
lock.lock();
try {
//1. 判断
while (number != 3)
{
condition3.await();
}
//2. 干活
System.out.println(Thread.currentThread().getName()+"\t"+ Thread.currentThread().getId()+"\t");
//3. 通知
number = 1;
condition1.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
/**
* 多线程之间按顺序调用,实现A->B->C
* 线程操作资源类
* 判断干活通知
* 防止虚假唤醒
*/
public class ThredOrderAccess
{
public static void main(String[] args){
ShareResource shareResource = new ShareResource();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
shareResource.print5();
}
},"A").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
shareResource.print10();
}
},"B").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
shareResource.print15();
}
},"C").start();
}
}