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'