月眸


多线程通信例子

毛毛小妖 2019-07-24 115浏览 0条评论
首页/ 正文
分享到: / / / /

需求:线程A 打印5遍,线程B打印10遍,线程C打印15遍。且线程A打印完才能打印线程B,线程B打印完才能打印线程C

package com.demo.lock;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

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

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

 

最后修改:2019-07-24 23:00:29 © 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

上一篇

发表评论

说点什么吧~

评论列表

还没有人评论哦~赶快抢占沙发吧~