本次用ReentanLock,因为ReentanLock相比Synchronized可以指定唤醒具体的某一个线程 ,得益于ReentanLock的绑定条件Condition;
在多线程这块,首先要明白工作流程分为三步:
- 线程操作资源类
- 具体的某个线程干活
- 敢完活通知其他线程
那么先来个资源类
```java
//资源类
class ShareResource{
private int number = 1; //通过控制 number来执行具体的线程 1-A 2-B 3-C
private Condition c1 = lock.newCondition();
private Condition c2 = lock.newCondition();
private Condition c3 = lock.newCondition();
private void print5(){
lock.lock()
try{
while(number !=1){
c1.await();
}
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+i);
}
//通知
c2.singal();
}catch (Exception e)
e.printStackTrace();
}finally{
lock.unlock();
}
}
private void print10(){
lock.lock()
try{
while(number !=2){
c2.await();
}
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+i);
}
//通知
c3.singal();
}catch (Exception e)
e.printStackTrace();
}finally{
lock.unlock();
}
}
private void print15(){
lock.lock()
try{
while(number !=3){
c3.await();
}
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+i);
}
//通知返回1
c1.signal();
}catch (Exception e)
e.printStackTrace();
}finally{
lock.unlock();
}
}
//开启线程调动资源类
class Main{
public static void main(String []args){
ShareResource sr = new ShareResource();
new Thread(()->{
sr.print5();
},"A").start();
}
new Thread(()->{
sr.print10();
},"B").start();
}
new Thread(()->{
sr.print15();
},"C").start();
}
}
效果如下:
A1
A2
A3
A4
A5
B1
B2
B3
B4
B5
B6
B7
B8
B9
B10
C1
C2
C3
C4
C5
C6
C7
C8
C9
C10
C11
C12
C13
C14
C15
当然如果要打印ABC 各一次 直接调整资源类里的次数就好了, 可以通用好多线程轮流打印的功能。