JUC学习笔记(4)—多线程之间按顺序调用

多线程之间按顺序调用,实现A->B->C 三个线程启动,要求如下:
AA打印5次,BB打印10次,CC打印15次   接着 AA打印5次,BB打印10次,CC打印15次    。来10轮  

 

public class ThreadOrderAccess
{
	public static void main(String[] args)
	{
		ShareResource sr = new ShareResource();
		
		new Thread(() -> {
			for (int i = 1; i <=10; i++) 
			{
				sr.print5(i);
			}
		}, "AA").start();
		
		new Thread(() -> {
			for (int i = 1; i <=10; i++) 
			{
				sr.print10(i);
			}
		}, "BB").start();		
		
		new Thread(() -> {
			for (int i = 1; i <=10; i++) 
			{
				sr.print15(i);
			}
		}, "CC").start();		
		
	}
}

class ShareResource
{
	private int number = 1;//1 - A   2 - B 3 - C.....
	private Lock lock  = new ReentrantLock();
	private Condition c1 = lock.newCondition();
	private Condition c2 = lock.newCondition();
	private Condition c3 = lock.newCondition();
	
	public void print5(int totalLoop)
	{
		lock.lock();
		try 
		{
			//1 判断
			while(number != 1)
			{
				c1.await();
			}
			//2 干活
			for (int i = 1; i <=5; i++) 
			{
				System.out.println(Thread.currentThread().getName()+"\t"+i+"\t totalLoop:"+totalLoop);
			}
			//3 通知
			number = 2;
			c2.signal();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
	
	public void print10(int totalLoop)
	{
		lock.lock();
		try 
		{
			//1 判断
			while(number != 2)
			{
				c2.await();
			}
			//2 干活
			for (int i = 1; i <=10; i++) 
			{
				System.out.println(Thread.currentThread().getName()+"\t"+i+"\t totalLoop:"+totalLoop);
			}
			//3 通知
			number = 3;
			c3.signal();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}	
	public void print15(int totalLoop)
	{
		lock.lock();
		try 
		{
			//1 判断
			while(number != 3)
			{
				c3.await();
			}
			//2 干活
			for (int i = 1; i <=15; i++) 
			{
				System.out.println(Thread.currentThread().getName()+"\t"+i+"\t totalLoop:"+totalLoop);
			}
			//3 通知
			number = 1;
			c1.signal();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}	
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值