java—基于编译顺序以固定顺序运行的多线程

dfty9e19  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(295)

这个问题在这里已经有答案了

java:线程顺序(6个答案)
上个月关门了。
我正在尝试使用下面的代码找出多线程顺序。
我使用synchonized来阻止其他线程,而其中一个线程正在同步部分中运行。我希望线程1应该首先开始和结束,然后是线程2,最后是线程3。但结果总是1,3,2
为什么会这样?不应该像12 3或13 2那样随机执行吗?

public class hello {
    static class runnablethread extends Thread{
        private static int k = 5;
        public void run() {
            synchronized (runnablethread.class) {
                System.out.println(Thread.currentThread().getName() + " start:" + System.currentTimeMillis());
                try {
                    Thread.sleep(1000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName() + " end:" + System.currentTimeMillis());
        }
    }
    public static void main(String[] args) {
        runnablethread r1 = new runnablethread();
        new Thread(r1,"Thread1").start();
        new Thread(r1,"Thread2").start();
        new Thread(r1,"Thread3").start();
    }
}
Thread1 start:1606114065880

Thread1 end:1606114066885

Thread3 start:1606114066885

Thread3 end:1606114067889

Thread2 start:1606114067889

Thread2 end:1606114068894
mm5n2pyu

mm5n2pyu1#

start()方法实际上并不调用run方法,它只是表示线程已经准备好执行调度。然后jvm调度线程的执行,但是这种调度不能保证调度的顺序与它们启动的顺序相同。
在您的特定情况下,代码序列

new Thread(r1,"Thread1").start();
new Thread(r1,"Thread2").start();
new Thread(r1,"Thread3").start();

执行得很快,jvm最后有3个线程可以调度。
如果要等待某个线程的终止,可以使用join方法。
也可以使用setpriority()方法更改线程的优先级。
如果代码执行了多次,我们可以注意到线程是随机启动的

$ java hello
Thread1 start:1606124964911
Thread1 end:1606124965915
Thread3 start:1606124965915
Thread3 end:1606124966921
Thread2 start:1606124966921
Thread2 end:1606124967926

$ java hello
Thread1 start:1606124969152
Thread1 end:1606124970155
Thread3 start:1606124970155
Thread2 start:1606124971157
Thread3 end:1606124971157
Thread2 end:1606124972162

$ java hello
Thread1 start:1606124975920
Thread1 end:1606124976925
Thread3 start:1606124976925
Thread3 end:1606124977926
Thread2 start:1606124977926
Thread2 end:1606124978930

$ java hello
Thread2 start:1606124980589
Thread3 start:1606124981592
Thread2 end:1606124981592
Thread3 end:1606124982594
Thread1 start:1606124982594
Thread1 end:1606124983599

相关问题