如何使对象等待几毫秒,然后在等待时间内取消活动等待?

时间:2012-01-01 21:26:08

标签: java multithreading locking

我绑定导致对象等待一段时间。在此期间,对象可能被锁定,无法处理任何命令。等待期间可以取消等待活动。

首先,我尝试了以下方法,这是一种简单的方法:

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()方法就不会取消任何线程。

如何解决我的问题?

1 个答案:

答案 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)";