共计 2179 个字符,预计需要花费 6 分钟才能阅读完成。
上面是阿里 P7 的一道口试题,公众号【Java 斗帝】内回复 666 有收费电子书赠送
1、题目
编写一个程序,开启 3 个线程,这 3 个线程的 ID 别离为 A、B、C,3 个线程交替打印 1-100 的整数,样例 Sample:
Thread1:1
Thread2:2
Thread3:3
Thread1:4
Thread2:5
Thread3:6
....
Thread3:99
Thread1:100
大家能够先思考一下,试试看看是否实现?
2、解题思路
题目中要求 3 个线程启动之后,须要按程序一个接着一个来执行,重点是 3 个线程都处于运行状态,如何能让他们按程序来打印?
大家能够把 3 个线程设想为 3 集体(ABC),ABC 3 集体手拉手组成一个环,而后 3 集体都坐那等告诉,等谁的告诉呢,期待上一个人的告诉,B 期待 A 的告诉,C 期待 B 的告诉,A 期待 C 的告诉。
刚开始:程序先唤起 A,A 打印之后,告诉 B,而后 A 进入休眠期待唤醒告诉,此时轮到 B 打印了,B 打印之后告诉 C,B 进入休眠期待唤醒告诉,此时轮到 C 打印了,C 打印之后告诉 A,C 进入休眠期待唤醒告诉,通过这种形式来实现,每个线程打印之后,负责唤醒下一个线程,而后本人进入休眠状态。
关键技术点有 2 个:
1、阻塞线程
2、唤起线程
java.util.concurrent.locks.LockSupport 类刚好提供了 2 个静态方法反对这些操作
1、park():让以后线程阻塞
2、unpark(Thread thread):用来唤起阻塞中的线程
3、答案
代码相当简略。
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.LockSupport;
public class ThreadTest {static List<Thread> threadList = new ArrayList<>();// 寄存线程的汇合
static int threadSize = 3;// 总共多少个线程
static int threadIndex = 0;// 以后线程下标
static int maxValue = 100;// 须要输入的数的最大值
static int curValue = 1;// 数的以后值
public static void main(String[] args) throws InterruptedException {
// 创立线程
for (int i = 1; i <= threadSize; i++) {Thread thread = new Thread(() -> {while (true) {
// 阻塞以后线程
LockSupport.park();
// 以后的值须要小于最大值
if (curValue <= maxValue) {System.out.println(Thread.currentThread().getName() + ":" + curValue++);
} else {break;}
// 唤起下一个线程
LockSupport.unpark(threadList.get(++threadIndex % threadList.size()));
}
// 唤起所有线程
threadList.forEach(LockSupport::unpark);
});
thread.setName(String.format("Thread%d", i));
threadList.add(thread);
}
// 启动所有线程
for (Thread thread : threadList) {thread.start();
}
// 唤起第一个线程
LockSupport.unpark(threadList.get(0));
}
}
举荐浏览
为什么阿里巴巴的程序员成长速度这么快,看完他们的内部资料我懂了
程序员达到 50W 年薪所须要具备的常识体系。
—小时解读并发编程三大个性
对于【暴力递归算法】你所不晓得的思路
看完三件事❤️
如果你感觉这篇内容对你还蛮有帮忙,我想邀请你帮我三个小忙:
点赞,转发,有你们的『点赞和评论』,才是我发明的能源。
关注公众号『Java 斗帝』,不定期分享原创常识。
同时能够期待后续文章 ing????