join()如何工作? (Java中的多线程)

前端之家收集整理的这篇文章主要介绍了join()如何工作? (Java中的多线程)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在准备考试,经过一些抽样练习(其中包含正确的答案),我根本无法理解.

问题

(多重选择):下面的程序的一些可能的结果是什么?

一个)
价值是1.
价值是1.
最终值为1.

B)
价值是1.
价值是1.
最终值为2.

C)
价值是1.
最终值为1.
价值是2.

D)
价值是1.
最终值为2.
价值是2.

该程序

  1. public class Thread2 extends Thread {
  2.  
  3. static int value = 0;
  4. static Object mySyncObject = new Object();
  5.  
  6. void increment() {
  7.  
  8. int tmp = value + 1;
  9. value = tmp;
  10.  
  11. }
  12.  
  13. public void run() {
  14.  
  15. synchronized(mySyncObject) {
  16.  
  17. increment();
  18. System.out.print("Value is " + value);
  19.  
  20. }
  21.  
  22. }
  23.  
  24. public static void main(String[] args) throws InterruptedException {
  25.  
  26. Thread t1 = new Thread2();
  27. Thread t2 = new Thread2();
  28.  
  29. t1.start();
  30. t2.start();
  31.  
  32. t1.join();
  33. t2.join();
  34.  
  35. System.out.print("Final value is " + value);
  36.  
  37. }
  38.  
  39. }

正确的答案是:A),C)和D).

对于情况A)我不明白两个线程(从同步块(!)中增加一个看似静态的变量)的最终可能会被设置为1,最终的值也是1?

情况C和D对我来说同样令人困惑,因为我真的不明白main()在所需的线程(t1和t2)之前完成的可能性如何.我的意思是,他们的join()方法已经从main函数中被调用了,所以要理解主要函数应该是等到t1和t2都用它们的run()方法完成(并且打印出它们的值) …?

如果有人可以引导我,这将是非常棒的.

提前感谢,非常感谢!
芥末

解决方法

答案或问题有问题.

你对join()的理解是正确的.直到两个线程完成后才能打印“最终值”消息.对join()的调用确保了这一点.

此外,increment()方法只能从一个静态字段中键入的同步块中调用.所以没有办法这个方法可以同时被两个线程调用. “Value is”输出也在同一个同步块内.因此,除了在同步块内,任何地方都不能访问value属性.因此,这些操作是线程安全的.

该程序唯一可能的输出是“值为1.值为2.最终值为2.” (实际上,输出之间没有时间段或空格 – 我只是匹配答案的格式.)

我无法解释为什么这不符合任何答案,除了谁写的问题弄乱了一些事情.

猜你在找的MsSQL相关文章