在 java 中挂起、恢复和停止线程

suspending, resuming and stopping threads in java

我正在 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.");
}
}

但是这个街区:

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

为什么这个块必须指定同步?

我知道 "synchronized" 用于控制线程对共享资源的访问以及如何使用此关键字,但在示例中,只有 2 个线程:主线程和 ob1 线程。并且 Main 线程不会进入同步块或 MyThread class 中的任何同步方法。我只是想不通原因。

我试图删除块前面的 "synchronized" 关键字。程序在线程 "My Thread" 中返回了一个错误,而主线程仍然完成了它的执行。

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

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

因此:您需要同步块(或方法)来防止 IllegalMonitorStateException 用于以下对 wait()!

的调用