java指定线程执行顺序

导读:本篇文章讲解 java指定线程执行顺序,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

众所周知,指定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

java指定线程执行顺序

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

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

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

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

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

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

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

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

 

如果错误之处欢迎指出。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/6485.html

(0)
小半的头像小半

相关推荐

半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!