利用park/unpark实现循环打印
有四个线程,分别打印A、B、C、D,要求用户输入数字,比如输入3,打印出ABCDABCDABCD
直接上代码
package com.example.demo.ThreadDemo;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.LockSupport;
/**
* @program: demo
* @description: park/unpark实现线程循环
* @author: 郭雄帅
* @create: 2020-07-08 13:46
*/
public class ThreadDemo1 {
public volatile List list = new ArrayList<String>();//我试过用static修饰,结果是一样的
Thread threadA = new Thread();
Thread threadB = new Thread();
Thread threadC = new Thread();
Thread threadD = new Thread();
public void doPrint(int i){
threadA = new Thread(() -> {
for (int j = 0;j<i;j++){
//list中的元素除以4的余数不等于0,相当于D还没存,需要等待
while (list.size()%4!=0){
LockSupport.park();
}
list.add("A");
LockSupport.unpark(threadB);
}});
threadB = new Thread(() -> {
for (int j = 0;j<i;j++){
//list中的元素除以4的余数不等于1,相当于A还没存,需要等待
while (list.size()%4!=1){
LockSupport.park();
}
list.add("B");
LockSupport.unpark(threadC);
}});
threadC = new Thread(() -> {
for (int j = 0;j<i;j++){
//list中的元素除以4的余数不等于2,相当于B还没存,需要等待
while (list.size()%4!=2){
LockSupport.park();
}
list.add("C");
LockSupport.unpark(threadD);
}});
threadD = new Thread(() -> {
for (int j = 0;j<i;j++){
//list中的元素除以4的余数不等于3,相当于C还没存
while (list.size()%4!=3){
LockSupport.park();
}
list.add("D");
LockSupport.unpark(threadA);
}});
threadA.start();
threadB.start();
threadC.start();
threadD.start();
}
public static void main(String[] args) throws InterruptedException {
ThreadDemo1 demo1 = new ThreadDemo1();
demo1.doPrint(3);
Thread.sleep(2000);
System.out.println(list);
}
}`
执行结果:

本文通过示例代码展示了如何使用多线程和park/unpark方法,来实现用户输入数字后,四个线程按A、B、C、D顺序循环打印的功能。

565

被折叠的 条评论
为什么被折叠?



