gpt4 book ai didi

java - java 中的暂停、恢复和停止线程

转载 作者:行者123 更新时间:2023-12-02 02:51:14 24 4
gpt4 key购买 nike

我正在学习java中的线程。

以下示例显示如何挂起、恢复和停止线程:

class MyNewThread implements Runnable {
Thread thrd;

boolean suspended;
boolean stopped;

MyNewThread(String name) {
thrd = new Thread(this, name);
suspended = false;
stopped = false;
thrd.start();
}

public void run() {
System.out.println(thrd.getName() + " starting.");
try {
for(int i = 0; i<1000; i++) {
System.out.print(i + " ");
if(i%10 == 0) {
System.out.println();
Thread.sleep(250);
}

synchronized(this) {
while(suspended) {
wait();
}
if(stopped) break;
}
}
} catch(InterruptedException ex) {
System.out.println(thrd.getName() + " interrupted.");
}
System.out.println(thrd.getName() + " exiting.");
}

synchronized void mystop() {
stopped = true;
suspended = false;
notify();
}

synchronized void mysuspend() {
suspended = true;
}

synchronized void myresume() {
suspended = false;
notify();
}
}

public class Suspend {
public static void main(String[] args) {
MyNewThread ob1 = new MyNewThread("My Thread");
try {
Thread.sleep(1000);

ob1.mysuspend();
System.out.println("Suspending Thread.");
Thread.sleep(1000);

ob1.myresume();
System.out.println("Resuming Thread.");
Thread.sleep(1000);

ob1.mysuspend();
System.out.println("Suspending Thread.");
Thread.sleep(1000);

ob1.myresume();
System.out.println("Resuming Thread.");
Thread.sleep(1000);

ob1.mysuspend();
System.out.println("Stopping Thread.");
ob1.mystop();
} catch(InterruptedException ex) {
System.out.println("Main Thread interrupted.");
}

try {
ob1.thrd.join();
} catch(InterruptedException ex) {
System.out.println("Main Thread interrupted.");
}
System.out.println("Main Thread exiting.");
}
}

但是这个 block :

synchronized(this) {
while(suspended) {
wait();
}
if(stopped) break;
}

为什么这个 block 必须指定为synchronized?

我知道“同步”用于控制线程对共享资源的访问以及如何使用这个关键字,但在示例中,只有2个线程:主线程和ob1线程。主线程不会进入 MyThread 类中的同步块(synchronized block)或任何同步方法。我就是想不出原因。

我尝试删除 block 前面的“synchronized”关键字。当主线程仍完成执行时,程序在线程“My Thread”中返回错误。

最佳答案

要回答您的直接问题:您需要在this同步,因为您正在调用wait()在此上。

为了调用 wait(),调用线程必须拥有调用 wait() 的对象的监视器

所以:您需要同步块(synchronized block)(或方法)来防止 IllegalMonitorStateException对于以下 wait() 调用!

关于java - java 中的暂停、恢复和停止线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43816927/

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