我绑定导致对象等待一段时间。在此期间,对象可能被锁定,无法处理任何命令。等待期间可以取消等待活动。
首先,我尝试了以下方法,这是一种简单的方法:
public void toWaiting(int waitingTime)
{
synchronized(this) // this is the reference for the current object
{
try {
this.wait(waitingTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
可行,当前对象可能会被阻止等待,但我无法在等待时间内取消此等待活动。
所以我尝试使用Thread来处理这个问题。将wait方法放入线程中,然后通过调用 Thread.interrupt()取消等待活动。我写了以下代码:
public void toWaiting(int waitingTime)
{
robotWaitTask waitingTask = new robotWaitTask(waitingTime);
waitingTask.start();
}
// Generate a thread which could cause the object waiting for a interval
class robotWaitTask extends Thread
{
int waitingTime;
public robotWaitTask(int waitingTime)
{
this.waitingTime = waitingTime;
}
public void run()
{
synchronized(this)
{
try {
this.wait(waitingTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
上述方法无效,因为当前对象未被阻止,除非我将 waitingTask.start()更改为 waitingTask.run()(我不知道)为什么,没有例外)。我知道调用run方法不会导致新的Thread生成,它只是一个直接调用。因此,如果我使用 waitingTask.run(),那么interrupt()方法就不会取消任何线程。
如何解决我的问题?
答案 0 :(得分:0)
您的代码应该正常运行。您说除非您更改为使用.run(),否则不会阻止当前对象。如果调用.run(),则表示该方法在当前线程中执行,而不是单独的线程。这可能就是你“注意到”它阻塞的原因。 如果使用.start(),将创建一个单独的线程,并在该单独的线程中阻止该对象。与此同时,您的主线程将继续执行。
robotWaitTask waitingTask = new robotWaitTask(1000);
waitingTask.start(); //start a new thread, and the object is blocked in a separate thread
//this line will print as soon as the previous line called even before 1000ms
System.out.println("here)";
robotWaitTask waitingTask = new robotWaitTask(1000);
waitingTask.run();
//this line will print after 1000ms because the object is blocked in this thread
System.out.println("here)";