0

我编写了一些代码,将一个可调用对象提交给执行程序,将未来存储在一个映射中的一个 id 中。在调用方法中,我等待设置一个标志,然后再继续。基本上我需要等待外部操作返回给我并说我们完成了 - 这是数据,现在你可以继续......我认为我所拥有的不正确:

public class MyClass implements Callable<Boolean> {

    ---
    ---
    private boolean done = false;

    @override
    public Boolean call() {

        --  wait for flag to be set...
        //continue....
    }

}

--主要代码--

//create the above class..

//submit it...

//get the future store in map...

//-- wait for response from external application...

///tie it up with an id

//set the attribute so the callable can continue and complete..

问题:

  1. 以上将不起作用,因为我返回的是 Future 而不是对象。我正在考虑创建一个继承自可调用类的新接口——这有意义吗?

  2. 如果没有收到响应,我需要线程等待然后死掉。是否可以在线程上设置它?

4

3 回答 3

3

您可以安排一个任务,该任务将取消等待的任务。当等待任务完成时,它可以取消计划任务。(先完成的将取消另一个)

这假设您首先有一个可中断的任务。

于 2012-07-13T13:02:31.927 回答
0

有一个等待(长时间超时)功能可用..这里有一些文档

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html

使用这个 wait(long timeout) 函数,线程将一直等待,直到它得到一个 notify()(或 notifyAll()),或者直到超时到期。

以下任何一项都将打破 wait();

  1. 通知();
  2. 通知所有();
  3. 达到超时
于 2012-07-13T13:04:34.680 回答
0

使用Future#get(long, TimeUnit).

这将等待一段时间以获得答案,TimeoutException如果在给定的时间段内没有返回值,则抛出 a。然后捕获异常并让线程优雅地完成。

于 2012-07-13T13:05:07.453 回答