在将此标记为重复之前,请仔细阅读该问题.
下面是伪代码的片段.我的问题是 - 以下代码是否没有打败并行异步处理的概念?
我问这个的原因是因为在下面的代码中,主线程将提交一个要在不同线程中执行的任务.在队列中提交任务后,它会阻止Future.get()方法为任务返回值.我宁愿在主线程中执行任务,而不是提交到不同的线程并等待结果.通过在新线程中执行任务我获得了什么?
我知道你可以等待有限的时间等,但如果我真的关心结果呢?如果要执行多个任务,问题会变得更糟.在我看来,我们只是同步地完成工作.我知道Guava库提供了非阻塞侦听器接口.但我很想知道我对Future.get()API的理解是否正确.如果它是正确的,为什么Future.get()设计为阻止从而打败整个并行处理过程?
注 - 为了记录,我使用JAVA 6
public static void main(String[] args){
private ExectorService executorService = ...
Future future = executorService.submit(new Callable(){
public Object call() throws Exception {
System.out.println("Asynchronous Callable");
return "Callable Result";
}
});
System.out.println("future.get() = " + future.get());
}
Run Code Online (Sandbox Code Playgroud) 在我的所有任务中,我有一些必须连续处理(它们永远不能同时运行,必须按顺序处理).
我实现了为每组必须连续执行的任务创建一个单独线程的独立线程池.它有效,但我没有资源.我不控制组的数量,所以我最终可能会同时运行一些荒谬的线程.
有什么方法可以通过单个线程池实现这一点吗?是否有一个包含多个阻塞队列的线程池,我可以确保每个队列的串行执行?
只是强调我在第二段中所说的内容:我已经使用单线程线程池为每组必须连续执行的任务解决了这个问题.不过,我不能继续这个解决方案.有太多的团体,我不能拥有所有这些线程.
我发现了这个相关的问题,但由于它不是最近的,我仍然创造了我的.我所做的只是试图避免重新发明轮子,但似乎我没有选择.
我使用缓存线程池ExecutorService来运行一些异步后台任务.我已经提供了我的ThreadFactory,它将线程分发给ExecutorService(只要它需要它们).我对缓存线程池的理解是,在线程空闲60秒后,它由ExecutorService终止.
当我的线程即将被终止时,我想执行一些状态清理.实现这一目标的最佳方法是什么?ExecutorService不容易为线程的生命周期提供钩子.
我不想关闭我的ExecutorService - 对于在它们到来时运行任务非常有用.
ExecutorService executor = Executors.newCachedThreadPool(new MyThreadFactory());
// Do some work
executor.submit(new MyCallable());
// Need a way for the ExecutorService to notify me when it is about to
// terminate my thread - need to perform some cleanup
Run Code Online (Sandbox Code Playgroud)
谢谢,
Shreyas
在AsynchronousFileChannelJava中NIO.2 API包含的void force(boolean)方法.
显然这种方法是阻塞的,因为只有在将更改成功写入设备后才能返回.
我正在寻找一种方法来实现相同的目标,而不会阻塞线程.
正如评论中所提到的,这将等同于标准C库函数aio_fsync:http://pubs.opengroup.org/onlinepubs/009695399/functions/aio_fsync.html
我有以下测试代码.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
class MyTask extends FutureTask<String>{
@Override
protected void done() {
System.out.println("Done");
}
public MyTask(Runnable runnable) {
super(runnable,null);
}
}
public class FutureTaskTest {
public static void main(String[] args) {
ExecutorService executor = Executors.newSingleThreadExecutor();
FutureTask<String> future = new MyTask(new Runnable() {
public void run() {
System.out.println("Running");
}
});
executor.submit(future);
try {
future.get();
} catch (Exception ex ) {
ex.printStackTrace();
}
executor.shutdownNow();
}
}
Run Code Online (Sandbox Code Playgroud)
这很好 - 在任务完成时调用MyTask中被覆盖的'done'方法.但是遗嘱执行人如何知道如何称呼它?
执行者只有这些提交方法:
public <T> Future<T> submit(Callable<T> task);
public Future<?> submit(Runnable …Run Code Online (Sandbox Code Playgroud) 我正在使用Executor框架使用线程池启动多个线程,即newFixedThreadPool.我使用threadpool.submit(aThread)来提交要由线程池执行的作业,这很好但是我需要确定所有线程何时完成,以便我可以继续进行其他处理.我看着使用Future.get()阻塞,直到线程完成,这里的问题是它阻塞直到结果可用.我还看了继续调用isTerminated()方法然后在发出关闭后调用睡眠以检查所有线程是否完整但这对我来说似乎并不整齐.还有另一种清洁方式吗?此外,如果在任何一个线程中引发异常,我希望能够终止所有其他正在运行的线程,并且还要阻止池中任何排队的线程启动.这样做的最佳机制是什么?
期待听到您的回复
TIA
我使用ExecutorService的Java的Web服务器应用程序的并行执行风格的一些计算任务,然后调用shutdown()与awaitTermination()等待做的所有任务.整个计算有时可能需要几十分钟.
awaitTermination()方法是阻塞主线程,直到超时(或中断),但我只是想启动任务并立即响应客户端,并在所有任务竞争后关闭服务(遵循约定总是关闭线程池).
所以我的问题是,有什么方法可以在完成所有任务后通知我,以便我可以调用该shutdown()方法?听者还是什么..
谢谢!
java ×7
asynchronous ×2
threadpool ×2
concurrency ×1
executor ×1
nio ×1
nio2 ×1
oop ×1
terminate ×1