手工创建一个线程池,执行callable任务
/**
* @Information:
* @Author: HeHaoYuan
* @Date: Created at 13:48 on 2019/8/12
* @Package_Name: PACKAGE_NAME
*/
import java.util.concurrent.*;
public class MyExecutorService implements Callable {
int tick = 20;
@Override
public String call() throws Exception {
for (int i = 0; i < 20; i++) {
if (tick > 0) {
System.out.println(Thread.currentThread().getName()+"票还剩下" + tick-- + "张");
}
}
return "票已经卖完";
}
}
class ExecutorTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyExecutorService thread1 = new MyExecutorService();
/**
* 核心线程池的大小是:3
* 线程池的最大数量:5
* 空闲线程的存活时间:2000
* 空闲线程的存活时间的单位:ms
* 工作队列:基于链表结构的阻塞队列
* 饱和策略:没有声明默认采用AbortPolicy (无法处理新任务抛出异常)
*/
ExecutorService executorservice =
new ThreadPoolExecutor(3,3,
2000,TimeUnit.MILLISECONDS,
new LinkedBlockingDeque<>());
Future future = executorservice.submit(thread1);
Future future2 = executorservice.submit(thread1);
Future future3 = executorservice.submit(thread1);
future.get();
future2.get();
future3.get();
//关闭线程池
executorservice.shutdown();
}
}
最大任务执行个数等于核心线程池的大小
import java.util.concurrent.*;public class MyExecutorService implements Callable {int tick = 20; @Overridepublic String call() throws Exception {for (int i = 0; i < 20; i++) {if (tick > 0) {System.out.println(Thread.currentThread().getName()+"票还剩下" + tick-- + "张"); } }return "票已经卖完"; }}class ExecutorTest {public static void main(String[] args) throws ExecutionException, InterruptedException {MyExecutorService thread1 = new MyExecutorService(); ExecutorService executorservice = new ThreadPoolExecutor(3,5, 2000,TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>()); Future future = executorservice.submit(thread1); Future future2 = executorservice.submit(thread1); Future future3 = executorservice.submit(thread1); future.get(); future2.get(); future3.get(); //关闭线程池executorservice.shutdown(); }}