java指定线程执行顺序

众所周知,指定java线程的执行顺序一般都是通过线程间的join方法

比如有3个线程,t1,t2,t3。

如果我们需要将线程执行顺序调整为 t3 -> t2 -> t1。那么在t3的线程中加入t2.join,t2的线程中加入t1.join方式即可解决。

 

第二种方式我们可以用线程池解决。

public class ThreadYield extends Thread {

    public ThreadYield(String name){
        super(name);
    }

    @Override
    public void run() {
        System.out.println("当前线程为" + this.getName());
    }


    public static void main(String[] args) throws InterruptedException{
        ThreadYield yield = new ThreadYield("張三");
        ThreadYield yield1 = new ThreadYield("李四");
        ThreadYield yield2 = new ThreadYield("王五");
        ExecutorService executors = Executors.newSingleThreadExecutor();
        executors.submit(yield2);
        executors.submit(yield1);
        executors.submit(yield);
    }
}

通过线程池的submit方式提交线程,因为 newSingleThreadExecutor 线程池是单线程的,所以每次只会执行一个线程。

 

 

另外说一个就是涉及到线程的优先级,有些人认为线程的优先级也会影响线程的执行顺序。

可以参考下另外一篇文章 https://blog.csdn.net/lexang1/article/details/49885277

也就是说如果是在线程个数较少的情况下,需要指定线程的执行顺序,我们可以偷懒的指定下线程的优先级,最低的为1,其次为5,最高的为10。借助线程的优先级级别是可以做到控制的线程的执行顺序的。

然而并不是说优先级为10的线程就一定比优先级为9的线程先执行

public class TestPriorityThread implements Runnable{

    @Override
    public void run() {
        // TODO Auto-generated method stub
        for(int i=0;i<100000;i++){
            //消耗CPU的计算,性能差的机器,请修改循环限制
            Math.hypot(Math.pow(924526789, i), Math.cos(i));
        }
        //输出线程优先级
        System.out.println("Priority:"+Thread.currentThread().getPriority());
    }


    public void start(int _priority){
        Thread t=new Thread(this);
        //设置线程优先级
        t.setPriority(_priority);
        t.start();
    }

    public static void main(String[] args) {
        for(int i=0;i<20;i++){
            new TestPriorityThread().start(i%10 + 1);
        }
    }
}

这部分代码是参考的上述的链接。

执行这部分代码的console信息显示 线程的级别为9的可能运行在线程级别为10的之前。每次执行的结果都会有点偏差,因为线程的执行的随机性

Priority:10
Priority:9
Priority:9
Priority:10
Priority:8
Priority:7
Priority:8
Priority:7
Priority:6
Priority:6
Priority:5
Priority:5
Priority:4
Priority:3
Priority:4
Priority:3
Priority:1
Priority:1
Priority:2
Priority:2

这是官方API里的中文解释。

通过上述代码的结论可以看出线程的优先级并不一定能控制线程的执行顺序,如果线程级别之间差的数字较大,这一规则是基本可以符合的。

引用上述文中的话来说就是:

(1)  并不是严格遵照线程优先级别来执行的

比如线程优先级为9的线程可能比优先级为10的线程先执行,优先级为1的线程可能比优先级为2的线程先执行,但很少会出现优先级为2的线程比优先级为10的线程先执行 (这里用了一个词“很少”,是说确实有可能出现,只是几率非常低,因为优先级只是表示线程获得CPU运行的机会,并不代表强制的排序号)。

(2)  优先级差别越大,运行机会差别越明显

比如优先级为10的线程通常会比优先级为2的线程先执行,但是优先级为6的线程和优先级为5的线程差别就不太明显了,执行多次,你会发现有不同的顺序。
 

如果线程为2个或者3个,严格按照优先级顺序控制为1,5,10。那么基本可以确定线程的执行顺序的。

 

如果错误之处欢迎指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值