Tag: 未来

如果没有中断,Future.cancel()会怎么做?

来自Future.cancel()上的java文档 boolean cancel(boolean mayInterruptIfRunning) 尝试取消执行此任务。 如果任务已完成,已取消或由于某些其他原因无法取消,则此尝试将失败。 如果成功,并且在调用cancel时此任务尚未启动,则此任务永远不会运行。 如果任务已经启动, 则mayInterruptIfRunning参数确定执行此任务的线程是否应该在尝试停止任务时被中断 。 我的问题是,如果mayInterruptIfRunning为false,取消会怎么做? 如果任务已经运行,它如何取消或停止执行?

即使任务完成,future.isDone也返回false

我有棘手的情况,即使线程完成, future.isDone()也会返回false 。 import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class DataAccessor { private static ThreadPoolExecutor executor; private int timeout = 100000; static { executor = new ThreadPoolExecutor(10, 10, 1000, TimeUnit.SECONDS, new ArrayBlockingQueue(1000)); } public static void main(String[] args) { List […]

等待多个期货的回调

最近我使用API​​深入研究了一些工作。 API使用Unirest http库来简化从Web接收的工作。 当然,由于从API服务器调用数据,我试图通过使用API​​的异步调用来提高效率。 我的想法结构如下: 通过返回期货结果来创建数据数组 显示数据+从数据中收集的其他信息 因此,在开始第二步之前,我需要返回所有数据。 我的代码如下: Future < HttpResponse > future1 = Unirest.get(“https://example.com/api”).asJsonAsync(new Callback () { public void failed(UnirestException e) { System.out.println(“The request has failed”); } public void completed(HttpResponse response) { System.out.println(response.getBody().toString()); responses.put(response); } public void cancelled() { System.out.println(“The request has been cancelled”); } }); Future < HttpResponse > future2 = Unirest.get(“https://example.com/api”).asJsonAsync(new […]

能够在Future 对象上获得进展

参考java.util.concurrent包和Future接口,我注意到(除非我弄错了)启动冗长任务并能够查询进度的能力仅来自SwingWorker实现类。 这引出了以下问题: 有没有办法在非GUI非Swing应用程序(映像控制台应用程序)中在后台启动冗长的任务并允许其他线程检查进度? 在我看来,没有理由将此function限制在swing / GUI应用程序中。 否则,我看到的唯一可用选项是通过ExecutorService :: submit返回Future对象。 但是,基本Future接口不允许监视进度。

multithreading搜索操作

我有一个方法需要一系列查询,我需要针对不同的搜索引擎Web API运行它们,例如谷歌或雅虎。 为了并行化进程,为每个查询生成一个线程,然后在最后join ,因为我的应用程序只能在获得每个查询的结果后才能继续。 我目前有以下几点: public abstract class class Query extends Thread { private String query; public abstract Result[] querySearchEngine(); @Override public void run() { Result[] results = querySearchEngine(query); Querier.addResults(results); } } public class GoogleQuery extends Query { public Result querySearchEngine(String query) { // access google rest API } } public class Querier { /* […]

使用FutureTask而不是Callable有什么好处?

有两种方法可以提交和轮询任务结果 FutureTask futureTask = new FutureTask(callable); 使用Callable和Future组合并在ExecutorService提交。 使用future.get()检索结果。 Future future = service.submit(callable); 使用FutureTask 。 这将包装Callable ,然后使用FutureTask检索结果。 service.execute(task); 使用FutureTask不是Callable + Future组合有什么好处?

为什么在可调用中设置中断位

因此,该资源( http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html )建议在线程不处理中断本身时设置线程中的中断位,“ 这样,调用堆栈上方的代码可以了解中断并在需要时响应它 。“ 假设我正在使用ExecutorService在不同的Thread中运行某些东西。 我构造一个Callable并将此Callable传递给ExecutorService.submit(),它返回一个Future。 如果Callable被中断然后重置中断位,则在调用Future.get()时,关联的Future不会抛出InterruptedException。 那么,如果此Future是主线程访问生成的线程的唯一方式,那么在Callable中设置被中断位的目的是什么呢? class MyCallable implements Callable { @Override public String call() { while (!Thread.currentThread().isInterrupted()) { } Thread.currentThread().interrupt(); return “blah”; } } ExecutorService pool = makeService(); Future future = pool.submit(new MyCallable()); // Callable gets interrupted and the Callable resets the interrupt bit. future.get(); // Does not thrown an InterruptedException, […]

Scala期货和`andThen`exception传播

我在scala.concurrent.Future模块中阅读了Scala 2.11.8和andThen函数的文档,它说如下: def andThen[U](pf: PartialFunction[Try[T], U]) (implicit executor: ExecutionContext): Future[T] 将副作用函数应用于此未来的结果,并返回具有此未来结果的新未来。 此方法允许强制执行回调以指定顺序执行。 请注意,如果链接的andThen回调之一抛出exception,则该exception不会传播到后续的andThen回调。 相反,后续的andThen回调将被赋予此未来的原始值。 我不确定它是什么意思是exception不会被传播, andThen也没有提供示例。 例如,如果我做这样的事情: Future.successful { throw new RuntimeException(“test”) } andThen { case _ => println(“test”) } 在Scala REPL中我得到: java.lang.RuntimeException: test … 32 elided 所以exception被传播了。 有人可以提供一个有意义的例子,这究竟意味着什么,以及是否安全使用andThen代码,我抛出exception,我想从中恢复。 谢谢。

Fork-Join相关:join()vs get()vs invoke()

是否有必要使用join()和fork()或者我也可以使用join() , get() , invoke() 。 我检查了API ,除了get()抛出InterruptedException和ExecutionException我没有看到差异……而invoke()似乎完全相同。 但是我总是看到与join()相关的fork()而不是其他两种方法……它们不提供并行性吗? 将invoke()和join()完全相同的目的是什么? 通过实现future,我可以理解get(),但是invoke()和join()呢。 提前致谢。 编辑 :我在API中的不好实际引用了它,因为已经收到的答案指出了它。 但他们的意思是: 方法invoke()在语义上等同于fork(); join()但总是尝试在当前线程中开始执行 提前致谢。

将可填写的未来中的exception映射到不同的exception类型?

我正在使用java 8的可完成期货,我希望能够采取未来抛出的exception并将其转换为另一个exception。 一旦发生exception,我试过的所有复合材料似乎都会被短路。 例如,使用scala future,我可以这样做: scala.concurrent.Future translatedException = ask.recover(new Recover() { @Override public Object recover(final Throwable failure) throws Throwable { if (failure instanceof AskTimeoutException) { throw new ApiException(failure); } throw failure; } }, actorSystem.dispatcher()); 我希望能够在未来的java复合块中模仿它。 这可能吗?