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

时间:2017-05-06 05:05:13

标签: java multithreading synchronized synchronized-block

我在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;
}

为什么必须同步指定此块?

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

我试图删除&#34; synchronized&#34;关键字在块之前。程序在线程中返回错误&#34; My Thread&#34;虽然主线程仍然完成了它的执行。

0 个答案:

没有答案