Java 螺纹不';我不能按预期执行

Java 螺纹不';我不能按预期执行,java,multithreading,junit,Java,Multithreading,Junit,我写了一个简单的多线程程序,但它没有以预期的方式运行 public class LockTest { private Lock lock = new ReentrantLock(); @Test public void maintest(){ System.out.println("main program"); LockTest lockTest = new LockTest(); Thread a = new Thr

我写了一个简单的多线程程序,但它没有以预期的方式运行

public class LockTest {

    private Lock lock = new ReentrantLock();

    @Test
    public void maintest(){
        System.out.println("main program");
        LockTest lockTest = new LockTest();
        Thread a = new Thread(){
            @Override
            public void run(){
                System.out.println("thread a");
                lockTest.process();
            }
        };

        Thread b = new Thread(){
            @Override
            public void run(){
                System.out.println("thread b");
                lockTest.process();
            }
        };

        a.start();
        b.start();
    }

    public void process(){
        System.out.println("start process");
        int i = 0;
        boolean result = false;
        do {
            i++;
            result = lock.tryLock();
            System.out.println(result + " " + i);
        }while (!result && i < 3);
        if (!result){
            System.out.println("get no lock");
            return;
        }
        try {
            System.out.println("get lock");
            System.out.println("process aaa");
            System.out.println("process bbb");
            Thread.sleep(1000);

            System.out.println("process ddd");
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            lock.unlock();
            System.out.println("release lock");
        }
    }
}
或显示结果:

Connected to the target VM, address: '127.0.0.1:50935', transport: 'socket'
main program
thread b
thread a
start process
start process
false 1
true 1
get lock
process aaa
process bbb
false 2
false 3
get no lock
Disconnected from the target VM, address: '127.0.0.1:50935', transport: 'socket'

Process finished with exit code 0
为什么程序不执行整个代码?在Java8中使用IntelliJIdea,JUnit测试

a.join();
b.join();
开始两个踏板后

它将等待踏板完成

Connected to the target VM, address: '127.0.0.1:50935', transport: 'socket'
在java调试器调试JVM的端口时打印

Disconnected to the target VM, address: '127.0.0.1:50935', transport: 'socket'
当java调试器不再执行或应用程序已结束时打印

本质上,应用程序有时在其他线程收到CPU时间之前完成。为了确保主线程等待其他线程完成(这意味着它们获得CPU时间来完成各自的
run()
方法),请使用线程方法
join()
。这会导致调用线程(在本例中为主线程)等待该线程的完成

由于多线程的性质,多线程可能会产生不同的结果。中断、交换、资源分配等等决定线程何时执行以及何时等待CPU时间。现在请记住,当计算机在执行线程之间切换时,这些等待时间在微观层面上


如果您希望应用程序在每次运行时都能产生相同的结果,那么您需要的是确定性多线程,需要仔细的同步和设计才能完成。如果您希望每次都以相同的顺序运行逻辑,则不应使用多线程,否则将需要过于完整的条件来否定多线程的功能。

您的问题不清楚。发生了什么?你期望发生什么?
Disconnected to the target VM, address: '127.0.0.1:50935', transport: 'socket'