多线程题之轮流打印A 5次,B 10次,C 11次

本次用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 各一次 直接调整资源类里的次数就好了, 可以通用好多线程轮流打印的功能。

你可能感兴趣的:(Java,实用型代码Demo)