java - 我是否以正确的方式使用可调用和 future 多线程(java)?

标签 java multithreading

我需要多线程完成一些任务。
我事先知道当所有任务完成后我将继续我的计划。
以下代码是否适用于此目的?

  public void test() {
    Callable<String> myCall = new Callable() {

        @Override
        public String call() throws Exception {
            return doDomething();
        }
    };


    Callable<String> myCall2 = new Callable() {

        @Override
        public String call() throws Exception {
            return doDomething2();
        }
    };

    ExecutorService executor = Executors.newFixedThreadPool(2);
    List<Callable<String>> list = Arrays.asList(myCall,myCall2);
    List<Future<String>> futuresList = executor.invokeAll(list);

    String result1 = futuresList.get(0).get();

    String result2 = futuresList.get(0).get();

    //...
}

我正在尝试更改它以使用泛型:

public void test() {
Callable<?> myCall = new Callable() {

    @Override
    public String call() throws Exception {
        return doDomething();
    }
};


Callable<?> myCall2 = new Callable() {

    @Override
    public String call() throws Exception {
        return doDomething2();
    }
};

ExecutorService executor = Executors.newFixedThreadPool(2);
List<Callable<?>> list = Arrays.asList(myCall,myCall2);
List<Future<?>> futuresList = executor.invokeAll((Collection<? extends Callable<?>>)list);

String result1 = futuresList.get(0).get();

String result2 = futuresList.get(0).get();

// ...
}

我得到以下编译错误:

The method invokeAll(Collection<? extends Callable<T>>) in the type ExecutorService is not applicable for the arguments (Collection<capture#2-of ? extends Callable<?>>).

最佳答案

除了您两次访问第零索引外,我没有发现任何问题。

此编辑是关于您关于如何在没有 ExecutorService 的情况下实现它的问题。正如 ColinD 所说,你真的不应该我会说明原因

要获得相同的功能集,您需要两个对象并使用两个线程作为闩锁

String result1 = null;

String result2 = null;

public void test() {
    Thread thread1 = new Thread(new Runnable(){
        public void run(){
            result1 = doSomething();
        }
    });
    Thread thread2 = new Thread(new Runnable(){
        public void run(){
            result2 = doSomething2();
        }
    });
    thread1.start(); 
    thread2.start();
    thread1.join(); 
    thread2.join();
    ...
    ...

}

现在如果你想添加另一个线程/工作单元,那么你需要什么

Thread thread3 = new Thread(new Runnable(){
            public void run(){
                result3 = doSomething3();
            }
        });
thread3.start();
thread3.join();

等等。因此,您的解决方案是更好的方法。

关于java - 我是否以正确的方式使用可调用和 future 多线程(java)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6430178/

相关文章:

java - TextInputLayout : EditText added is not a TextInputEditText. 请改用该类

c# - 这两种暂停/恢复线程的方法有什么区别?

r - 如何在多线程遍历迭代之前和之后减少 foreach 花费的时间?

c - 单线程在 WinSock recv() 处阻塞所有其他线程

c++ - OpenGL 多线程/共享上下文和 glGenBuffers

java - 如何在 PDFBox API 2 中获取字段页面?

java - Android studio 2.2.0-rc1 gradle插件报错

java - 使用Java中的Kinect数据集计算两条线(代表人的 ARM )之间的角度

java - 移位时字节值的内存分配

java - 同样的计算怎么会产生不同的结果