多线程(13)线程池2
一:线程池
有四种创建线程池方法,但是我们开发是不推荐使用的,我们可以直接自己创建线程池,来配置我们需要的参数来实现
Executors.newCachedThreadPool();
Executors.newFixedThreadPool(5);
Executors.newSingleThreadExecutor();
Executors.newScheduledThreadPool(3);
public class Test { public static void main(String[] args) { ExecutorService service= Executors.newCachedThreadPool(); ThreadPoolExecutor threads=new ThreadPoolExecutor(2,3,8, TimeUnit.SECONDS,new ArrayBlockingQueue<>(5)); for(int i=0;i<100;i++) { threads.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } // execute和submit的区别: // execute只能提交Runnable类型的任务,无返回值。submit既可以提交Runnable类型的任务,也可以提交Callable类型的任务,会有一个类型为Future的返回值,但当任务类型为Runnable时,返回值为null。 // execute在执行任务时,如果遇到异常会直接抛出,而submit不会直接抛出,只有在使用Future的get方法获取返回值时,才会抛出异常 }); } } }
执行多个任务:Callable返回结果
public class Test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService service= Executors.newCachedThreadPool();
//创建线程池
ThreadPoolExecutor threads=new ThreadPoolExecutor(2,3,8, TimeUnit.SECONDS,new ArrayBlockingQueue<>(5));
ArrayList<Object> sum=new ArrayList<>();
for (int i = 0; i <10; i++) {
//相当于提交了多个线程,for循环就是我们提交多个线程来执行******
Future<Object> future = threads.submit(new Callable<Object>() {
@Override
public Object call() throws Exception {
int j = 0;
j++;
Thread.sleep(50);
System.out.println(Thread.currentThread().getName());
return j;
}
});
sum.add(future.get());
}
System.out.println(sum.toString());
}
}
pool-2-thread-1
pool-2-thread-2
pool-2-thread-1
pool-2-thread-2
pool-2-thread-1
pool-2-thread-2
pool-2-thread-1
pool-2-thread-2
pool-2-thread-1
pool-2-thread-2
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
浙公网安备 33010602011771号