import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class MultiFutureThread {
public static void main(String[] args) {
int sizeNum = 5;
// 创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(sizeNum);
ArrayList<Future<String>> results = new ArrayList<Future<String>>();
try {
for (int i = 0 ;i < sizeNum; i++) {
CallThread t = new CallThread(i);
// 执行任务并获取Future对象
Future f = pool.submit(t);
results.add(f);
//如果这里加上返回的值,在线程变为一个个开启,可能会卡,还会出现下一个线程会等到上一个线程开启完再执行
//System.out.println("各个线程的值:" + f.get().toString());
}
pool.shutdown();
// 获取所有并发任务的运行结果
for (Future f : results) {
// 从Future对象上获取任务的返回值,并输出到控制台
System.out.println("关闭线程池后,各个线程的值:" + f.get().toString());
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import java.util.concurrent.Callable;
/**
* 开启线程,返回值
*/
public class CallThread implements Callable<Object>{
private int numberThread;
public CallThread(int numberThread) {
this.numberThread = numberThread;
}
@Override
public Object call() throws Exception {
System.out.println("线程 : " + numberThread + "开启");
return numberThread;
}
}
1.输出结果 (在开启线程时候获取返回值)
线程 : 0开启
各个线程的值:0
线程 : 1开启
各个线程的值:1
线程 : 2开启
各个线程的值:2
线程 : 3开启
各个线程的值:3
线程 : 4开启
各个线程的值:4
关闭线程池后,各个线程的值:0
关闭线程池后,各个线程的值:1
关闭线程池后,各个线程的值:2
关闭线程池后,各个线程的值:3
关闭线程池后,各个线程的值:4
2.输出结果 (最后才获取线程值)
线程 : 0开启
线程 : 1开启
关闭线程池后,各个线程的值:0
关闭线程池后,各个线程的值:1
线程 : 2开启
关闭线程池后,各个线程的值:2
线程 : 3开启
关闭线程池后,各个线程的值:3
线程 : 4开启
关闭线程池后,各个线程的值:4