java - 提交给执行者的 FutureTask 不运行

标签 java android concurrency futuretask

我写了一个类,它的一系列实例旨在从 AsyncTask 中调用,它将从方法 runReport() 返回结果。它很好地创建了一个工作线程,但出于某种原因,它随后不执行 Callable 的 call() 方法。我做错了什么?

//Problem: doStuff() never gets called, even though the worker thread gets created.

@Override
public ReportResult runReport() throws InterruptedException, ExecutionException {
    Callable<ReportResult> report = new Callable<ReportResult>() {

        @Override
        public ReportResult call() throws Exception {
            doStuff();
            ...
            return new ReportResult(varWrittenByMethod);
        }
    };
    FutureTask<ReportResult> result = new FutureTask<ReportResult>(report);

    //I tried a few of these ExecutorService factory methods, with the same result.
    //I only made my own ThreadFactory to verify the worker was created
    ExecutorService es = Executors.newSingleThreadExecutor(new ThreadFact());
    es.submit(report);

    ReportResult finalResult = result.get();
    es.shutdownNow();
    return finalResult;
}


private class ThreadFact implements ThreadFactory{

    @Override
    public Thread newThread(Runnable r) {
        Log.d(TAG, "Created worker Thread");
        return new Thread(r);
    }

}

据我所知,我必须在它自己的线程中将其作为 FutureTask 执行此操作,因为它需要执行以下操作(除了返回之外的所有操作都在 doStuff() 中):

  • 做大量的同步设置(AsyncTask 使它脱离 UI 线程)
  • 调用 Looper.prepare()
  • 注册一个监听器
  • 调用 Looper.loop(),在一段时间内捕获来自监听器的一些回调。
  • 当我有足够的数据点时,在监听器回调中调用 Looper.myLooper().quit()
  • 返回结果

我愿意接受更好的方法来做到这一点。我最初让 AsyncTask 进行此调用,然后在其线程上运行 Looper.loop(),但我无法处理这些对象的队列,因为我需要在返回结果之前从监听器调用 Looper.myLooper.quit() ,这不可逆转地毒化了线程的消息队列。

最佳答案

您的线程工厂不会将传递的 Runnable 传播到创建的线程。在您的 ThreadFactory 中,尝试:

return new Thread(r);

此外,您应该使用提交方法返回的 FutureTask,而不是您明确创建的那个。例如

FutureTask<ReportResult> result = es.submit(report);
ReportResult finalResult = result.get();

关于java - 提交给执行者的 FutureTask 不运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13851695/

相关文章:

java - Java中的runLater block 之间是否存在并发?

java - 使用 GridBagLayout 对齐对象

java - 了解神秘的 Oracle JDBC 错误 - ORA-00911 : invalid character

android - Android:java.lang.RuntimeException:无法实例化 Activity ComponentInfo:java.lang.NullPointerException

android - 编写 NFC 标签,使其适用于 Android 和 Windows Phone8

java Fork/Join 关于堆栈使用的说明

java - 如何避免单元测试中出现OptimisticLockException?

java - 在 Java 8 中,如何从 ArrayList 获取字符串值并将它们存储在以逗号分隔的单个字符串中?

android - codegen生成的适配器构造函数中的 `moshi`是什么意思?

.net - 在单独的进程中运行 .net 代码