Java面试问题之四十七

请问如何才能安全地使线程暂停、恢复运行和停止,谈谈你的想法并举例说明。

答:虽然在Java中的Thread类中分别提供了使线程暂停(suspend()方法)、恢复运行(resume()方法)以及停止(stop()方法)的方法,但是使用这些方法会产生如下两点风险:
(1)容易造成死锁。
(2)一个线程强制中断另一个线程的运行,会造成另一个线程操作的数据停留在逻辑上不合理
的状态。
基于上述的原因,Thread类中直接控制线程暂停、恢复和停止的方法已经在JDK 1.2版本之后
被抛弃(Deprecated)。在实际编程中,一般是在受控制的线程中定义一个标志变量,其他线
程通过改变标志变量的值,来控制线程的暂停、恢复运行和自然终止。比如,我们可以定义一
个可控的线程类ControlledThread,它有一个state属性来控制它的状态:
• SUSP:暂停状态,线程进入当前线程对象的等待池。
• STOP:终止状态,线程会自然退出run()方法。
• RUN:运行状态,线程可以继续运行。
MachineControlledThread类继承ControlledThread类,因此MachineControlledThread是
受控制的线程。在MachineControlledThread类的run()方法的while循环中,每次循环结束前
都会调用checkState()方法,判断接下来到底是继续运行、还是暂停或者终止运行。

主线程通过调用MachineControlledThread对象的setState()方法来控制
MachineControlledThread线程。当MachineControlledThread对象的实例变量count的
值大于5时,就让MachineControlledThread线程暂停,把MachineControlledThread对
象的实例变量count设为0,然后在使MachineControlledThread线程恢复运行。主线程最
后终止MachineControlledThread线程的运行。


class ControlledThread extends Thread {
public static final int SUSP=1;
public static final int STOP=2;
public static final int RUN=0;

private int state = RUN;

public synchronized void setState(int state){
this.state = state;
if(state == RUN){
notify();
}
}

public synchronized boolean checkState() {
while(state == SUSP){
try {
System.out.println(Thread.currentThread().getName() + ":wait");
wait();
}catch(InterruptedException e){
throw new RuntimeException(e.getMessage());
}
}

if(state == STOP){
return false;
}

return true;
}
}

public class MachineControlledThread extends ControlledThread {
private int count;
public void run() {
while(true){
synchronized(this) {
count++;
System.out.println(Thread.currentThread().getName()+":run "+count+" times");
}
if(!checkState()){
System.out.println(Thread.currentThread().getName()+":stop"); break;
}
}
}

public synchronized int getCount() {return count;}

public synchronized void reset() {
count=0;
System.out.println(Thread.currentThread().getName()+":reset");
}

public static void main(String[] args) {
MachineControlledThread machine = new MachineControlledThread();
machine.start();
for(int i=0;i<30;i++){
if(machine.getCount()>5) {
machine.setState(ControlledThread.SUSP);
yield();
machine.reset();
machine.setState(ControlledThread.RUN);
}
yield();
}
machine.setState(ControlledThread.STOP);
}
}





值得注意的是,上述代码对线程的控制并不是实时的,当主线程在某个时刻执行了
machine.setState(ControlledThread.SUSP)方法时,machine线程并不会立刻进入暂停状
态。machine线程必须获得CPU,开始执行checkState()方法时,才会进入暂停状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值