码迷,mamicode.com
首页 > 编程语言 > 详细

java 多线程–线程交替

时间:2019-05-24 19:13:30      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:nts   alt   sdn   oid   hellip   detail   sleep   net   顺序   

要求:

借助同步机制,sleep()方法,join()方法,实现动画显示;
甲线程:1、3、5、7、9
乙线程:2、4、6、8、10
丙线程:a、b、c、d、e
main()线程输出:线程开始,线程结束

输出结果:线程开始,1-a-2## 3-b-4## 5-c-6## …

思考:

使用多个判断标记,模拟(消费者-生产者)每线程输出一个后就等待,然后改变自己的标记
临界资源–使用多个== putX() == 方法,判断属于自己的标记(== isEmptyX ==)然后输出
使多个线程有序的交替执行
代码:

class Resource{
	private boolean isEmpty01 = true;
	private boolean isEmpty02 = false;
	private boolean isEmpty03 = false;
	
	//每个put方法对应一个输出,每输出一个就等待,等待其他人的唤醒
	public void put1(){
		while(!isEmpty01){
			try{
				wait();
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
		//输出后
		isEmpty01 = false;
		isEmpty02 = true;
		notifyAll();
	}
	public void put2(){
		while(!isEmpty02){
			try{
				wait();
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
		isEmpty02 = false;
		isEmpty03 = true;
		notifyAll(); 
	}
	public void put3(){
		while(!isEmpty03){
			try{
				wait();
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
		isEmpty03 = false;
		isEmpty01 = true;
		notifyAll();
	}
}

class Player01 implements Runnable{
	
	private Resource res;
	private String[] arr;
	Player01(){}
	Player01(String[] arr,Resource res){
		this.arr = arr;
		this.res = res;
	}
	
	public void run(){
		synchronized(res){
			for(int i=0;i<arr.length;i++){
				//错误的点
                //61,62,这两句不能交换顺序
				res.put1();
				System.out.print(arr[i]+"-");
                try{
					Thread.sleep(1000);
				}catch(InterruptedException e){
					e.printStackTrace();
				}
			}
		}
	}
}

class Player02 implements Runnable{
	
	private Resource res;
	private String[] arr;
	Player02(){}
	Player02(String[] arr,Resource res){
		this.arr = arr;
		this.res = res;
	}
	
	public void run(){
		synchronized(res){
			for(int i=0;i<arr.length;i++){
				res.put2();
				System.out.print(arr[i]+"-");
                try{
					Thread.sleep(1000);
				}catch(InterruptedException e){
					e.printStackTrace();
				}
			}
		}	
	}
}

class Player03 implements Runnable{
	
	private Resource res;
	private String[] arr;
	Player03(){}
	Player03(String[] arr,Resource res){
		this.arr = arr;
		this.res = res;
	}
	
	public void run(){
		synchronized(res){
			for(int i=0;i<arr.length;i++){
				res.put3();
				System.out.print(arr[i]+"## ");
                try{
					Thread.sleep(1000);
				}catch(InterruptedException e){
					e.printStackTrace();
				}
			}
		}
	}
}

class Test08{
	
	public static void main(String[] args){
		
		String[] arr1 = {"1","3","5","7","9"};
		String[] arr2 = {"a","b","c","d","e"};
		String[] arr3 = {"2","4","6","8","0"};
		
		Resource res = new Resource();
		
		Player01 p1 = new Player01(arr1,res);
		Player02 p2 = new Player02(arr2,res);
		Player03 p3 = new Player03(arr3,res);
		
		Thread t1 = new Thread(p1);
		Thread t2 = new Thread(p2);
		Thread t3 = new Thread(p3);
		
		t1.start();
		t2.start();
		t3.start();
	}
}

  

执行结果:

 

技术图片

重要的是:

这种利用标记可以实现超过2个线程的有序交替执行


原文:https://blog.csdn.net/qq_42701294/article/details/90321329

java 多线程–线程交替

标签:nts   alt   sdn   oid   hellip   detail   sleep   net   顺序   

原文地址:https://www.cnblogs.com/qbdj/p/10919371.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!