下面是阿里 P7 的一道笔试题,公众号【Java斗帝】内回复666有免费电子书赠送java
编写一个程序,开启 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
你们能够先思考一下,试试看看可否实现?算法
题目中要求 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 进入休眠等待唤醒通知,经过这种方式来实现,每一个线程打印以后,负责唤醒下一个线程,而后本身进入休眠状态。ide
关键技术点有 2 个:spa
一、阻塞线程.net
二、唤起线程线程
java.util.concurrent.locks.LockSupport类恰好提供了 2 个静态方法支持这些操做code
一、park():让当前线程阻塞
二、unpark(Thread thread):用来唤起阻塞中的线程
代码至关简单。
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)); } }
为何阿里巴巴的程序员成长速度这么快,看完他们的内部资料我懂了
若是你以为这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
点赞,转发,有大家的 『点赞和评论』,才是我创造的动力。
关注公众号 『 Java斗帝 』,不按期分享原创知识。
同时能够期待后续文章ing🚀