【发布时间】:2021-04-09 05:14:50
【问题描述】:
当我为变量分配一个新值时,它在 start() 之后不会改变,但是在我使用 join() 之后它会改变。为什么会发生这种情况?在这种情况下,int a 是否应该是 volatile 的?
class SampleThread extends Thread {
private static int a = 0;
@Override
public void run() {
a = 3;
}
public static void main(String[] args) throws InterruptedException {
Thread t2 = new Thread(new SampleThread());
t2.start();
System.out.println(a);
}
}
【问题讨论】:
-
为什么你希望新线程在主线程继续执行
println之前立即获得控制权?无法保证线程被调度的顺序。 -
确实如此,但主线程继续使用
System.out.println(a);,然后第二个线程将更改a(因此更改将发生在打印之后)。为了增加第二个线程在主线程打印之前更新a的机会,让主线程在调用println之前稍等片刻。您可以通过在System.out.println(a);之前调用Thread.sleep(1000);之类的东西来做到这一点。 -
如果应该执行 2 个线程,那么可能是在 JVM 退出之前只执行了 1 个线程(主线程);为了防止这种情况,我们可以使用 join() 以便 JVM 等到第二个线程完成后再终止。我说的对吗?
-
如果一个非守护线程仍然处于活动状态,那么 JVM 将不会退出。由于您的
t2线程未设置为守护进程,因此您的应用程序仅在 main 线程完成和t2完成时才会退出。.join用于强制调用该方法的线程等待其他线程完成其工作。在您的情况下,如果您在main中调用t2.join(),则主线程将等到t2完成其工作,然后才会继续(但在这种情况下,它甚至会破坏启动单独线程的目的)。跨度> -
如果您在
t2上明确地.join(),则不需要 volatile - 因为加入线程会建立先发生边缘。
标签: java multithreading volatile