问题描述
现在我有一个定时器在跑,代码如下:publicvoidrunTimer(StringspaceId,intuploadSpan,intdownloadSpan){UploadTaskuploadTask=newUploadTask();map.put("up"+spaceId,uploadTask);Timertimer=newTimer();timer.schedule(uploadTask,newDate(),uploadSpan);Timertimer2=newTimer();timer2.schedule(downloadTask,newDate(),downloadSpan);}publicvoidmain(Stringargs[]){TimerManagertimerManager=newTimerManagerImpl();timerManager.runTimer("01",1000,2000);timerManager.runTimer("02",1000,3000);timerManager.pauseTimer("01");}现在我要让定时器暂停一下,然后再接着跑,我用wait()方法和notify()方法来实现,代码如下:publicsynchronizedvoidpauseTimer(StringspaceId)throwsInterruptedException{//暂停定时器//TODOAuto-generatedmethodstubUploadTaskup=(UploadTask)map.get("up"+spaceId);if(up!=null){synchronized(up.getClass()){up.wait();}System.out.println("timer"+spaceId+"paused");}}用main函数调用,执行到up.wait();的时候出现异常java.lang.IllegalMonitorStateException:currentthreadnotowneratjava.lang.Object.wait(NativeMethod)atjava.lang.Object.wait(Object.java:429)atcom.telek.pms.impl.time.TimerManagerImpl.pauseTimer(TimerManagerImpl.java:46)atcom.telek.pms.impl.time.TimerManagerImpl.main(TimerManagerImpl.java:35)请教一下大家这是什么原因,谢谢了!
解决方案
解决方案二:
顶上去,大伙儿给看看啊……
解决方案三:
有一个方法,可以这样,先cancel掉,再重新new一下,schedule一下。
解决方案四:
你用的对象变化了,要声明一个全局的变量,每次只对它进行操作,不管是启动还是暂停。