gpt4 book ai didi

java - java Callable接口(interface)如何执行多任务

转载 作者:行者123 更新时间:2023-12-02 03:19:38 26 4
gpt4 key购买 nike

Here is the java.util.concurrent.FutureTask doc page ,这里使用lambda表达式而不创建Callable实现类,这是我的代码只是想测试callable接口(interface)如何工作,但结果让我不满意。

import java.util.concurrent.*;
public class CallableTest{
public static void main(String[] args){
FutureTask<Integer> ft = new FutureTask<Integer>((Callable<Integer>)() -> {
int i = 0;
for(; i < 100; i++){
System.out.println(Thread.currentThread().getName() + "\t"+ i);
}
return i;
});
for(int i = 0; i < 100; i++){
System.out.println(Thread.currentThread().getName() + "\t" + i);
if(i == 20){
new Thread(ft, "有返回值的线程").start();
new Thread(ft, "会不会执行呢?").start();
}
}
try{
System.out.println("The result of ft is " + ft.get());
}catch(Exception e){System.out.println(e);}
}
}

结果显示 new Thread(ft, "会不会执行呢?").start(); 创建的线程,无论迭代器次数是 100 还是其他,都不会执行。这就是为什么?我已经google过这个问题,但他们都说使用ThreadPool,但我认为如果这两个简单的线程不能工作,threadpool也不会。

最佳答案

FutureTask 通过以下转换维护一个状态:

 * Possible state transitions:
* NEW -> COMPLETING -> NORMAL
* NEW -> COMPLETING -> EXCEPTIONAL
* NEW -> CANCELLED
* NEW -> INTERRUPTING -> INTERRUPTED

如果状态不是NEW,则run方法仅返回:

    public void run() {
if (state != NEW ||
!UNSAFE.compareAndSwapObject(this, runnerOffset,
null, Thread.currentThread()))
return;
....
}

因此,每个线程都需要一个单独的 FutureTask 实例,因为在第一个线程执行后,ft 的状态不是 NEW

以下代码执行两个线程:

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

public class FutureTask {

public static void main(String[] args) {
FutureTask<Integer> ft = getFutureTask();
FutureTask<Integer> ft2 = getFutureTask();
new Thread(ft, "有返回值的线程").start();
new Thread(ft2, "会不会执行呢?").start();
try{
System.out.println("The result of ft is " + ft.get());
}catch(Exception e){System.out.println(e);}
try{
System.out.println("The result of ft2 is " + ft2.get());
}catch(Exception e){System.out.println(e);}
}

private static FutureTask<Integer> getFutureTask() {
return new FutureTask<Integer>((Callable<Integer>)() -> {
int i = 0;
for(; i < 100; i++){
System.out.println(Thread.currentThread().getName() + "\t"+ i);
}
return i;
});
}

关于java - java Callable接口(interface)如何执行多任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39817354/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com