gpt4 book ai didi

java - 线程在非同步段执行时进入阻塞状态的原因

转载 作者:行者123 更新时间:2023-12-01 21:36:43 24 4
gpt4 key购买 nike

我有两个线程正在运行:主线程和子线程。他们所做的 Activity 是:

  1. 子线程计算 1 到 100 的总和。
  2. 一旦子线程计算出总和,主线程就会打印总和(因此我使用了waitnotify)。它还输出子线程状态。

下面是代码部分。

class MainThread {
public static void main(String[] args) throws InterruptedException {
ThreadB b = new ThreadB();
b.setName("Child thread: ");
b.start();

synchronized(b) {
System.out.print("\nwaiting for b to complete\n");

b.wait();

System.out.print("\nno more wait .........................\n");
for (int i = 0; i < 1000; i++)
System.out.print("\n" + b.getName() + "'s state:" + b.getState());
}
Thread.sleep(1000);

System.out.print("\n" + b.getName() + "state:" + b.getState());
System.out.print("\ntotal in " + Thread.currentThread().getName() + "is :" + b.total);
}
}

class ThreadB extends Thread {

int total;

public void run() {
synchronized(this) {
for (int i = 0; i < 100; i++)
total += i;
System.out.println(this.getName() + "finished sum, lets notify other objects");

notify();
System.out.println(this.getName() + " done with notify and sync block\n");
}

System.out.println(this.getName() + " : entered non critical section");
for(int j = 0; j < 1000; j++) {
System.out.print("Hi ");
}
}
}
  1. 子进程完成其同步块(synchronized block)并通知主线程。甚至它开始了非同步部分,只不过是在循环中打印 "Hi "
  2. 现在主线程在收到通知后恢复其工作并打印子进程的状态。

但这是我的观察:在执行“Hi”(非同步块(synchronized block)中的for循环)时,有时 child 的状态是RUNNABLE并且大多数时候它已被阻止。例如:

Child thread: 's state:RUNNABLE Hi Hi Hi 

Child thread: 's state:BLOCKED Hi Hi Hi Hi

是什么导致子线程在执行其非同步块(synchronized block)时进入BLOCKED状态?

最佳答案

两个线程不能同时打印到同一设备。如果他们尝试,其中之一将不得不被阻止。

关于java - 线程在非同步段执行时进入阻塞状态的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36881734/

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