本文主要是介绍JUC并发编程-第二天:线程池相关,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
线程池相关
- 线程池
- 内置线程池的使用
- 线程池的关闭
- excute方法和submit方法的区别
线程池
线程池就是一个可以复用线程的技术
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler){return null;}
*[ ] 各个参数的含义
- corePoolSize:线程池的核心线程数(正式员工)
- maximumPoolSize:指定的最大线程数量(核心线程数和临时线程数之和)
最大员工总数:正式员工+外包员工
- keepAliveTime:临时线程存活时间(外包合同期限)
- unit:临时线程存活时间单位
- workQueue:任务队列(项目)
- threadFactory:线程工厂(招人的hr)
- handler:线程池拒绝策略
内置线程池的使用
内置线程池使用Executors工具类去创建线程池
public class ThreadPool {public static void main(String[] args) {//创建固定大小的线程池ExecutorService executorService = Executors.newFixedThreadPool(5);//创建单线程线程池ExecutorService threadExecutor = Executors.newSingleThreadExecutor();//创建动态线程线程池ExecutorService service = Executors.newCachedThreadPool();}
}
线程池的关闭
使用shutdown()或者shutdownNow()
- shutdown():线程执行完后关闭;
- shutdownNow():立即关闭,不管线程是否执行完毕;
关闭线程池,如果不关闭,线程池中的线程会一直占用系统资源,会导致内存泄漏,主线程一直不会退出
excute方法和submit方法的区别
excute方法用来执行runable任务对象。而submit方法用来执行未来任务对象
- 以计算1-100的任务为例
- excuter方法
public class RunableExcuteTask implements Runnable{int goal;public RunableExcuteTask(int goal) {this.goal = goal;}@Overridepublic void run() {int sum=0;for (int i = 1; i <=goal ; i++) {sum=sum+i;}System.out.println("1-"+goal+"的和是:"+sum);}
}
测试
public class ThreadPool {public static void main(String[] args) {Runnable task=new RunableExcuteTask(100);ExecutorService threadPool = Executors.newFixedThreadPool(5);threadPool.execute(task);threadPool.shutdown();}
}
- submit方法
public class CallableExcuteTask implements Callable<Integer> {int goal;public CallableExcuteTask(int goal) {this.goal = goal;}@Overridepublic Integer call() throws Exception {int sum=0;for (int i = 1; i <= goal; i++) {sum=sum+i;}return sum;}
}
测试
public class ThreadPool {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService threadPool = Executors.newFixedThreadPool(5);CallableExcuteTask excuteTask = new CallableExcuteTask(100);Future<Integer> future = threadPool.submit(excuteTask);Integer integer = future.get();System.out.println(integer);}
}
- 在处理异常方面
excute会在子线程中抛出异常,在主线程中捕捉不到;
submit不会立马抛出异常,而是会将异常暂时储存起来,等我们调用future.get()方法的时候才会抛出,并且可以在主线程中抛出。处理异常更方便
这篇关于JUC并发编程-第二天:线程池相关的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!