在 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()!
的调用
我正在 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()!
的调用