gpt4 book ai didi

java - 多线程中的 Join()

转载 作者:行者123 更新时间:2023-11-30 09:02:44 24 4
gpt4 key购买 nike

根据join的定义,join线程一直执行到执行完成,中间没有prempted(如果我错了请纠正我)。但是在下面的代码中:join线程t1不会停止主线程采取t1 执行之间的控制。为什么会这样?

public class JavaAtomic {

public static void main(String[] args) throws InterruptedException {

ProcessingThread pt = new ProcessingThread();
Thread t1 = new Thread(pt, "t1");
t1.start();
Thread t2 = new Thread(pt, "t2");
t2.start();
t1.join();
t2.join();
System.out.println("Processing count=" + pt.getCount());
}

}


class ProcessingThread implements Runnable {
private int count;


@Override
public void run() {
for (int i = 1; i < 5; i++) {
processSomething(i);
count++;
System.out.println(Thread.currentThread()+"---"+getCount()) ;
}
}


public int getCount() {
return this.count;
}


private void processSomething(int i) {
// processing some job
try {
Thread.sleep(i * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

输出:

Thread[t1,5,main]---1
Thread[t2,5,main]---2
Thread[t1,5,main]---3
Thread[t2,5,main]---4
Thread[t1,5,main]---5
Thread[t2,5,main]---5
Thread[t2,5,main]---6
Thread[t1,5,main]---7
Processing count=7

非常感谢贾延德拉

最佳答案

这是您的示例中发生的情况:

  • 主线程开始运行,实例化并启动t1t2
  • t1 运行一点
  • t2 运行一点
  • 主线程在 t1 上加入并阻塞直到 t1 完成
  • t1t2 继续做他们的事情。我们继续看到他们的输出。主线程正在阻塞。
  • t1 完成并且主线程解除阻塞
  • 主线程加入 t2。但是,恰好在您的特定输出示例中,t2 实际上在 t1 之前完成,这在线程调度程序的随机性下是完全可能的。因此,主线程不会阻塞第二次 join() 调用,因为 t2 已经完成。
  • 主线程运行完成,程序退出。

添加

以上答案不变。但是我注意到您的代码中存在线程安全问题。您有多个线程使用 ++ 运算符递增共享 ProcessThread 实例中的 count 变量。请注意 ++ 不是原子的(参见 this article ),因为它实际上包含四个操作:读取 count 的当前值,添加 1 ,将新值写回 count ,并将该值返回给调用者。在这四个操作之间的间隙中,线程调度程序可以抢占当前线程并插入另一个线程,该线程携带从 count 读取的过时值。尝试增加线程数并减少 sleep() 调用中的时间,您会看到当前计数数字看起来不一致(相同的数字可能出现不止一次,先低后高,等等)count 受制于线程之间的竞争条件。解决方案是将所有读取/写入包含到 synchronized 中的 count,或者使用 java.util.concurrent.atomic.AtomicInteger

关于java - 多线程中的 Join(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25882272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com