newFixedThreadPool的用法:每个线程处理一个业务逻辑,调用sumbit方法,通过Future接收返回结果,最后对多个线程处理结果进行合并,参考代码如下:
package Thread;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class FixedThreadPoolTest {
public static void main(String[] args)throws Exception {
//创建含有4个线程的线程池,用来处理4个任务
ExecutorService executorService = Executors.newFixedThreadPool(4);
Integer a = 0;
Integer b = 0;
Integer c = 0;
Integer d = 0;
long beginTime = System.nanoTime();
//调用sumbit方法,用future接收返回值
//模拟第1个线程,耗时1秒
Future<Integer> future1 = executorService.submit(new Callable<Integer>() {
public Integer call(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Integer newInteger = new Random().nextInt(10)+1;
return newInteger;
}
});
//模拟第2个线程,耗时2秒
Future<Integer> future2 = executorService.submit(new Callable<Integer>() {
public Integer call(){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Integer newInteger = new Random().nextInt(10)+1;
return newInteger;
}
});
//模拟第3个线程,耗时5秒
Future<Integer> future3 = executorService.submit(new Callable<Integer>() {
public Integer call(){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Integer newInteger = new Random().nextInt(10)+1;
return newInteger;
}
});
//模拟第4个线程,耗时10秒
Future<Integer> future4 = executorService.submit(new Callable<Integer>() {
public Integer call(){
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Integer newInteger = new Random().nextInt(10)+1;
return newInteger;
}
});
//future1.get()是一个阻塞的方法,必须上边对应的线程执行完毕,future中有了返回值之后才能取到结果,否则get()时就会阻塞
//从程序启动开始计算,1秒后打印a
a = future1.get();
System.out.println("a="+a);
//从程序启动开始计算,2秒后打印b
b = future2.get();
System.out.println("b="+b);
//从程序启动开始计算,5秒后打印c
c = future3.get();
System.out.println("c="+c);
//从程序启动开始计算,10秒后打印a
d = future4.get();
System.out.println("d="+d);
int result = a+b+c+d;
System.out.println("result=" + result);
long endTime = System.nanoTime();
//打印结果为共耗时10秒
System.out.println("共耗时" + (endTime-beginTime)/1000000000 + "毫秒");
}
}
小总结:如果不使用多线程,而是4个任务串行执行,将耗时1+2+5+10=18秒,这样极大的减少了运行时间。
0050线程池中的newFixedThreadPool的具体用法
原文:https://www.cnblogs.com/xiao1572662/p/12334881.html