两个线程的顺序是怎么控制的,怎么控制谁先打印出第一个数?
来源:7-7 交替打印

大喵爱学习
2019-09-18
悟空老师,两个线程的顺序是怎么控制的,怎么控制谁先打印出第一个数?
new Thread(new TurningRunner(), "偶数").start();
new Thread(new TurningRunner(), "奇数").start();
除了Thread.sleep(),不给线程起名字外,还有没有什么其他的方式呢?
写回答
2回答
-
这里两个线程谁先执行,我们是无法控制的,取决于操作系统的调度,先start不代表先执行,不过大概率是先启动的先执行。
有其他的方式,比如我们可以用CountDownLatch等控制线程流程的工具类,要求必须偶数线程先执行后,奇数线程才能执行。
00 -
w3n9
2020-05-12
这样可以吗,即使我先启动打印奇数的线程也可以正确输出
public class Print { public static void main(String[] args) { Holder holder=new Holder(); new Thread(new OddRunnable(holder)).start(); new Thread(new EvenRunnable(holder)).start(); } } class Holder{ boolean control; int count; } /** * 奇数线程方法 * */ class OddRunnable implements Runnable{ private final Holder holder; public OddRunnable(Holder holder) { this.holder=holder; } @Override public void run() { try { while(holder.count<100){ synchronized (holder){ while(!holder.control) holder.wait(); System.out.println("奇数线程:"+(holder.count++)); holder.control=false; holder.notify(); } } } catch (InterruptedException e) { e.printStackTrace(); } } } class EvenRunnable implements Runnable{ private final Holder holder; public EvenRunnable(Holder holder) { this.holder=holder; } @Override public void run() { try{ while(holder.count<100){ synchronized (holder){ while(holder.control) holder.wait(); System.out.println("偶数线程:"+(holder.count++)); holder.control=true; holder.notify(); } } }catch(InterruptedException e){ e.printStackTrace(); } } }
112020-05-12
相似问题