java 多线程 交替_java 多线程–线程交替

该博客介绍如何使用Java的同步机制、sleep()和join()方法,通过多个线程间的标记同步来实现线程的有序交替执行,从而达到动画显示的效果。线程甲、乙、丙分别按1、2、a...的顺序输出数字和字母,每个线程输出一个元素后等待其他线程唤醒,确保输出的顺序性。示例代码展示了如何设计和实现这样的多线程交互模型。
摘要由CSDN通过智能技术生成

要求:

借助同步机制,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

//错误的点

//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

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

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();

}

}

执行结果:

99edd3421a4bc722c2fad23f59bbdb69.png

重要的是:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值