Tag: future

公开@Asynchronous函数的当前进度以在View中使用

在我的JEE6-App(在Glassfish 3.0.1上运行)中,我有一个EmailEJB,它必须发送大量邮件。 邮件是异步发送的,所以它用新的EJB3.1 @Asynchronous注释,让它在一个单独的Thread中运行。 现在我想让用户了解该方法的当前状态:已发送了多少封邮件? 异步发送邮件工作正常,但我无法弄清楚如何从外部访问进度。 似乎我的做法是非常错误的,但不知何故它必须是可能的(也许是另一种方法)。 这就是我的EmailEJB目前的样子(它的伪代码,但解释了我想要的): @Stateful public class EmailEJB { @Asynchronous public Future sendMails() { for (int i=0; i<mails.size; i++) { sendMail(mails[i]) // i want to return the progress without returning 😉 return new AsyncResult(i) } } } //Just for the completeness… from outside, i’m accessing the progress like this: Future progress […]

如何使用ExecutorService进行轮询,直到结果到达

我有一个场景,我必须轮询远程服务器检查任务是否已完成。 一旦有,我会进行不同的调用以检索结果。 我原本认为我应该使用带有scheduleWithFixedDelay的SingleThreadScheduledExecutor进行轮询: ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); ScheduledFuture future = executor.scheduleWithFixedDelay(() -> poll(jobId), 0, 10, TimeUnit.SECONDS); public void poll(String jobId) { boolean jobDone = remoteServer.isJobDone(jobId); if (jobDone) { retrieveJobResult(jobId); } } 但是因为我只能提供一个Runnable来scheduleWithFixedDelay不能返回任何东西的scheduleWithFixedDelay ,所以我不明白future什么时候会完成。 调用future.get()甚至意味着什么? 我在等什么结果? 我第一次检测到远程任务已经完成,我想执行一个不同的远程调用并将其结果设置为future的值。 我想我可以使用CompletableFuture,我会转发到我的poll方法,然后将它转发到我最终完成它的retrieveTask方法: CompletableFuture result = new CompletableFuture(); ScheduledFuture future = executor.scheduleWithFixedDelay(() -> poll(jobId, result), 0, 10, TimeUnit.SECONDS); public void poll(String […]

在期货清单上流式传输的最有效方式

我通过流式传输对象列表来调用异步客户端方法。 该方法返回Future。 迭代调用后返回的Futures列表的最佳方法是什么(以便处理那些首先出现的Future)? 注意:异步客户端仅返回Future not CompletableFuture。 以下是代码: List<Future> listOfFuture = objectsToProcess.parallelStream() .map((object) -> { /* calling an async client returning a Future */ }) .collect(Collectors.toList());

ExecutorService Future ::变得非常慢

我正在并行化一个非常复杂的程序来加快速度。 为此,我大部分时间都使用ExecutorService 。 到目前为止它工作得很好,但后来我注意到只有一行代码使我的程序运行速度尽可能快一半。 这是exactScore.get()的行。 我不知道为什么,但它有时需要更多的0.1秒来获得Future Object的double值。 为什么是这样? 如何处理它运行得更快? 在multithreading中有没有办法直接在Double[]编写? 谢谢 int processors = Runtime.getRuntime().availableProcessors(); ExecutorService service = Executors.newFixedThreadPool(processors); // initialize output Double[] presortedExScores = new Double[sortedHeuScores.length]; for(int i =0; i < sortedHeuScores.length; i++ ){ final int index = i; final Collection formulas_for_exact_method = multimap.get(sortedHeuScores[i]); for (final MolecularFormula formula : formulas_for_exact_method){ Future exactScore = service.submit(new […]

ExecutorService的未来任务并未真正取消

我将Futures从ExecutorService推送到哈希映射中。 之后,我可以在哈希映射中调用取消期货。 虽然结果是正确的,但后来我在Callable过程中命中了断点,好像Future cancel()没有效果。 我认为这可能是两个不同引用的情况(即使引用ID在断点时被列为相同),但是想知道某些专家是否可以插入。这是代码的样子: ExecutorService taskExecutor = Executors.newCachedThreadPool(); Map <String, Future> results = new HashMap <String, Future>(); Future future = taskExecutor.submit(new MyProcessor(uid)); results.put(uid, future); 我允许继续处理(这是一个在传入任务时提交任务的循环),稍后我可能会尝试通过调用此方法从外部源取消: public static synchronized boolean cancelThread(String uid) { Future future = results.get(uid); boolean success = false; if (future != null) { success = (future.isDone() ? true : future.cancel(true)); if (success) […]

用于java.util.concurrent.Future的scala.concurrent.Future包装器

我正在使用Play Framework 2.1.1和一个生成java.util.concurrent.Future结果的外部Java库。 我正在使用scala future而不是Akka,我认为这是Play 2.1的正确选择。 如何在保持代码无阻塞的同时将java.util.concurrent.Future包装到scala.concurrent.Future中? def geConnection() : Connection = { // blocking with get connectionPool.getConnectionAsync().get(30000, TimeUnit.MILLISECONDS) } 上面的代码返回一个连接,但使用了get,所以它变成了阻塞 def getConnectionFuture() : Future[Connection] = { future { // how to remove blocking get and return a scala future? connectionPool.getConnectionAsync().get(30000, TimeUnit.MILLISECONDS) } } 理想情况下,我想要一个scala函数,它返回连接作为未来,如上面的代码,但没有通过get阻止代码。 我还需要在函数中添加什么才能使其无阻塞。 任何指针都会很棒。

如何组成Observable以避免给定的嵌套和依赖回调?

在这个博客中 ,他给出了这个 (复制/粘贴以下代码)回调地狱的例子。 但是,没有提到如何使用Reactive Extensions消除该问题。 所以这里F3取决于F1完成,F4和F5取决于F2完成。 想知道Rx中的function等价物是什么。 如何在Rx中表示F1,F2,F3,F4和F5都应该异步拉出? 注意:我目前正试图绕过Rx,所以在提出这个问题之前我没有尝试解决这个例子。 import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; public class CallbackB { /** * Demonstration of nested callbacks which then need to composes their responses together. * * Various different approaches for composition can be done but eventually they end up relying […]

如何使用invokeAll()让所有线程池完成他们的任务?

ExecutorService pool=Executors.newFixedThreadPool(7); List<Future> future=new ArrayList<Future>(); List<Callable> callList = new ArrayList<Callable>(); for(int i=0;i<=diff;i++){ String str="2013-"+(liDates.get(i).get(Calendar.MONTH)+1)+"-"+liDates.get(i).get(Calendar.DATE); callList.add(new HotelCheapestFare(str)); } future=pool.invokeAll(callList); for(int i=0;i<=future.size();i++){ System.out.println("name is:"+future.get(i).get().getName()); } 现在我希望pool在进入for循环之前invokeAll所有的任务但是当我运行这个程序for循环时,在invokeAll之前执行并抛出此exception: java.util.concurrent.ExecutionException: java.lang.NullPointerException at java.util.concurrent.FutureTask$Sync.innerGet(Unknown Source) at java.util.concurrent.FutureTask.get(Unknown Source) at com.mmt.freedom.cheapestfare.TestHotel.main(TestHotel.java:6‌​5) Caused by: java.lang.NullPointerException at com.mmt.freedom.cheapestfare.HotelCheapestFare.getHotelCheap‌estFare(HotelCheapes‌​tFare.java:166) at com.mmt.freedom.cheapestfare.HotelCheapestFare.call(HotelChe‌​apestFare.java:219) at com.mmt.freedom.cheapestfare.HotelCheapestFare.call(HotelChe‌​apestFare.java:1) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) atjava.util.concurrent.ThreadPoolExecutor$Worker.run(Unknow‌​n Source) at […]