多线程通信例子
网站首页 文章专栏 多线程通信例子
多线程通信例子
编辑时间:2019-07-25 16:53 作者:毛毛小妖 浏览量:49 评论数: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();
	}
}

 

推荐文章
来说两句吧
最新评论
    还没有人评论哦,快来坐沙发吧!