【发布时间】:2010-10-31 12:59:10
【问题描述】:
我使用 ThreadPoolExecutor 来运行一些操作,有时我取消了一些未来的任务并将其存储到一个列表中以安排一些其他任务要做,然后我想响应保存的已取消的未来任务。
但问题是当我将任务提交到池中时,它不会被执行,看起来取消或完成标志被线程执行器保存并识别,因此不会调用该线程。
我该怎么办?
【问题讨论】:
标签: java multithreading
我使用 ThreadPoolExecutor 来运行一些操作,有时我取消了一些未来的任务并将其存储到一个列表中以安排一些其他任务要做,然后我想响应保存的已取消的未来任务。
但问题是当我将任务提交到池中时,它不会被执行,看起来取消或完成标志被线程执行器保存并识别,因此不会调用该线程。
我该怎么办?
【问题讨论】:
标签: java multithreading
FutureTask 实现保持取消状态。本质上,当再次调用 run() 方法时,它会执行 CAS 操作,但由于状态不可运行而失败并立即返回,而无需调用内部 Callable 的 call() 方法。我看不到从中检索原始 Callable 或将 FutureTask 恢复到未取消状态的方法。
回应你应该怎么做...
你必须取消它们吗?为什么不让他们跑?如果您想要优先执行,您可以尝试使用PriorityBlockingQueue 创建您的ThreadPoolexecutor 并使用Comparator 来确定优先级。这将允许任务以正确的顺序执行,因为它们将根据Comparator 的结果添加到PriorityBlockingQueue。
【讨论】:
使用Runnable 代替线程。执行池可以像处理Thread 一样处理Runnable,但Runnable 可以重新运行多次。
【讨论】:
如果你想有一个返回值,你可以使用 Callable。 http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Callable.html
【讨论】: