小编saa*_*arp的帖子

Java FutureTask <>是否不使用ExecutorService?

最近出现了一个用例,其中我必须同时启动几个阻塞的IO任务并按顺序使用它们。我不想更改使用方的操作顺序,并且由于这是一个Web应用程序,并且它们是请求路径中的短暂任务,所以我不想在固定线程池上遇到瓶颈,并希望镜像该线程。 .Net异步/等待编码风格。这样做FutureTask<>似乎很理想,但是需要一个ExecutorService。这是试图消除对一个的需要。

操作顺序:

  1. 启动任务
  2. 做些事
  3. 消耗任务1
  4. 做其他事情
  5. 消耗任务2
  6. 完事

    ...

我想为每个线程生成一个新线程,FutureTask<>但是简化了线程管理。后run()完成,调用线程可以加入。

我想出的解决方案是:

包com.staples.search.util;

import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;

public class FutureWrapper<T> extends FutureTask<T> implements Future<T> {

    private Thread myThread;

    public FutureWrapper(Callable<T> callable) {
    super(callable);
    myThread = new Thread(this);
    myThread.start();
    }

    @Override
    public T get() {
    T val = null;
    try {
        val = super.get();
        myThread.join();
    }
    catch (Exception ex)
    {
        this.setException(ex);
    }
    return val;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里有一对夫妇的JUnit测试我创建比较FutureWrapperCachedThreadPool

@Test
public …
Run Code Online (Sandbox Code Playgroud)

java multithreading

3
推荐指数
1
解决办法
1232
查看次数

标签 统计

java ×1

multithreading ×1