两个线程的顺序是怎么控制的,怎么控制谁先打印出第一个数?

来源:7-7 交替打印

大喵爱学习

2019-09-18

悟空老师,两个线程的顺序是怎么控制的,怎么控制谁先打印出第一个数?

new Thread(new TurningRunner(), "偶数").start();
new Thread(new TurningRunner(), "奇数").start();

除了Thread.sleep(),不给线程起名字外,还有没有什么其他的方式呢?

写回答

2回答

悟空

2019-09-18

这里两个线程谁先执行,我们是无法控制的,取决于操作系统的调度,先start不代表先执行,不过大概率是先启动的先执行。

有其他的方式,比如我们可以用CountDownLatch等控制线程流程的工具类,要求必须偶数线程先执行后,奇数线程才能执行。

0
0

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

    }
}


1
1
悟空
可以的
2020-05-12
共1条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程