java 多线程–线程交替

Posted qbdj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 多线程–线程交替相关的知识,希望对你有一定的参考价值。

要求:

借助同步机制,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 多线程–线程交替的主要内容,如果未能解决你的问题,请参考以下文章

第79题JAVA高级技术-多线程13(线程按序交替执行)

第79题JAVA高级技术-多线程13(线程按序交替执行)

Java 测试:创建两个线程,模拟对话,交替输出

java 如何计算线程执行时间

java多线程 更优雅的实现线程同步:交替打印AB LockSupport实现

java线程执行完后自己结束吗