当操作线程的状态,如wait(),notify()等,如果没有给其加上同步方法,此时就会引起该异常。加上synchronizied关键字,将其编程同步代码块或同步方法,该异常消失。
public class SimpleThread extends Thread{
private boolean runningFlag = false;
private String argument = "";
public String getArgument() {
return argument;
}
public void setArgument(String argument) {
this.argument = argument;
}
public boolean isRunning() {
return runningFlag;
}
public synchronized void setRunningFlag(boolean runningFlag) {
this.runningFlag = runningFlag;
if(runningFlag){
this.notify();
}else{
try {
System.out.println("线程"+Thread.currentThread().getName()+"开始等待");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public SimpleThread(){
runningFlag = false; //线程创建的时候,让其等待任务
}
@Override
public synchronized void run() {
while(true){
if(!runningFlag){
try {
System.out.println("线程"+Thread.currentThread().getName()+"开始等待");
this.wait();//如果用户没有开启线程,则线程处于等待状态
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
try {
sleep(5000);//睡眠3秒
System.out.println("线程"+Thread.currentThread().getName()+"任务完成\n");
System.out.println("传入的参数是:"+getArgument());
setRunningFlag(false); //让当前线程处于等待任务状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}