当前位置: 首页 > 知识库问答 >
问题:

提交给执行器的FutureTask不运行

张银龙
2023-03-14

我编写了一个类,它的一系列实例将从AsyncTask调用,它将从方法runReport()返回一个结果。它很好地创建了一个工作线程,但由于某种原因,它不执行可调用的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);
    }

}
    null

我愿意用更好的方法来做这件事。我最初让AsyncTask进行这个调用,然后在它的线程上运行looper.loop(),但是我无法处理这些对象的队列,因为我需要在返回结果之前从侦听器调用looper.mylooper.quit(),这会不可逆转地毒害线程的消息队列。

共有1个答案

浦思源
2023-03-14

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

return new Thread(r);

此外,您应该使用submit方法返回的FutureTask,而不是您显式创建的FutureTask。例如。

FutureTask<ReportResult> result = es.submit(report);
ReportResult finalResult = result.get();
 类似资料:
  • 问题内容: 我希望HTML表单在提交后不执行任何操作。 这是不好的,因为它会导致页面重新加载。 基本上,我希望每当按下按钮或有人在键入数据后单击“输入”时都调用ajax函数。是的,我可以删除表单标签并添加,只需从按钮的onclick事件中调用该函数即可,但是我也希望“命中进入”功能而不会引起任何麻烦。 问题答案: 通过在通过“提交”按钮调用的javascript中使用,可以停止提交表单。 基本上,

  • 本文向大家介绍python执行get提交的方法,包括了python执行get提交的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python执行get提交的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的Python程序设计有所帮助。

  • 问题内容: 我有一个singleThreadExecutor以便以串行顺序执行提交给它的任务,即一个任务接一个,没有并行执行。 我有可运行的东西,像这样 } 例如,当我向上述单线程执行器提交MyRunnable的三个实例时,我希望执行第一个任务,并且由于Thread.sleep在TIMED_WAITING中具有其执行线程(我可能对特定的线程有误州)。其他两个任务不应分配有执行它们的线程,至少直到第

  • 向ExecutorService对象提交任务的执行顺序是什么? 场景:让我们暂时假设Executor线程池大小为5,我已经向它提交了20个可运行任务,我们知道一次只能执行5个任务,其余的任务将在bucket中等待。所以我的问题是提交的任务以什么顺序执行。它是遵循FIFO数据结构还是从bucket中随机选取任务。 还有,有没有办法指定它应该以什么顺序执行。 例子:

  • 在下面的代码中,我试图理解java-8中提供的可选的概念。我创建了下面的例子来掌握orElse()背后的原理。执行代码后,defaultmethod()的主体被执行,并返回 对象y。log语句按照我的预期打印了正确的数据。 问题是,为什么defaultMethod()中的所有日志都没有打印??引入is-orElse()仅返回值,而不执行所提供方法的整个主体。? 代码: 日志:

  • 我有一个应用程序,允许用户批量向图像添加水印。该应用程序将只使用一个线程,并且一次只能添加一个水印。 我希望用户能够更改一次运行的水印任务[线程]的数量:可能在设置中为[1-5],并且我不能使用固定的ThreadPool,因为它具有固定的池大小。 我研究了如何使用线程池执行器(ThreadPoolExecutor)私有静态线程池执行器(ThreadPoolExecutor)=(ThreadPool