线程池 迈不过友情╰ 2022-03-06 14:34 401阅读 0赞 # 线程池 # Java里面线程池的顶级接口是 java.util.concurrent.Executor , 但是严格意义上讲 Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是java.util.concurrent.ExecutorService 。 要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在 java.util.concurrent.Executors 线程工厂类里面提供了一些静态工厂,生成一些常用的线程池。**官方建议使用 Executors 工程类来创建线程池对象。** **Executors类**中有个创建线程池的方法如下: * public static ExecutorService newFixedThreadPool(int nThreads):返回线程池对 象。(创建的是有界线程池,也就是池中的线程个数可以指定最大数量) * public Future<?> submit(Runnable task) :获取线程池中的某一个线程对象,并执行。 > Future接口:用来记录线程任务执行完毕后产生的结果。 使用线程池中线程对象的步骤: 1. 创建线程池对象; 2. 定义类实现Runnable接口或Callable接口; 3. 重写run()方法或call()方法; 4. 创建Runnable或Callable实现类对象; 5. 使用线程池来提交任务; 6. 关闭线程池(一般不做)。 Runnable实现类代码: public class MyRunnable implements Runnable { @Override public void run() { System.out.println("我要一个教练"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("教练来了: " +Thread.currentThread().getName()); System.out.println("教我游泳,交完后,教练回到了游泳池"); } } 线程池测试类: public class ThreadPoolDemo { public static void main(String[] args) { // 创建线程池对象 ExecutorService service = Executors.newFixedThreadPool(2);//包含2个线程对象 // 创建Runnable实例对象 MyRunnable r = new MyRunnable(); //自己创建线程对象的方式 // Thread t = new Thread(r); // t.start(); ---> 调用MyRunnable中的run() // 从线程池中获取线程对象,然后调用MyRunnable中的run() service.submit(r); // 再获取个线程对象,调用MyRunnable中的run() service.submit(r); service.submit(r); // 注意:submit方法调用结束后,程序并不终止,是因为线程池控制了线程的关闭。 // 将使用完的线程又归还到了线程池中 // 关闭线程池 //service.shutdown(); } } **Callable 接口** Callable 接口其实和Runnable接口一样是用来放在子线程上执行的代码(任务); Callable 接口中也只有一个抽象方法 call(),这个抽象方法是**有返回值**的,返回值是泛型,而且**可以抛出异常** **ExecutorService** 中的方法: * Future submit(Callable task) : 获取线程池中的某一个线程对象,并执行. > Future :表示计算的结果. **Future**中的方法: * V get() : 获取计算完成的结果。 public class ThreadPoolDemo2 { public static void main(String[] args) throws Exception { // 创建线程池对象 ExecutorService service = Executors.newFixedThreadPool(2);//包含2个线程对象 // 创建Runnable实例对象 Callable<Double> c = new Callable<Double>() { @Override public Double call() throws Exception { return Math.random(); } }; // 从线程池中获取线程对象,然后调用Callable中的call() Future<Double> f1 = service.submit(c); // Futur 调用get() 获取运算结果 System.out.println(f1.get()); Future<Double> f2 = service.submit(c); System.out.println(f2.get()); Future<Double> f3 = service.submit(c); System.out.println(f3.get()); } } 线程池小案例: **需求: 使用线程池方式执行任务,返回1-n的和 分析: 因为需要返回求和结果,所以使用Callable方式的任务** 代码: public class Demo04 { public static void main(String[] args) throws ExecutionException,InterruptedException { ExecutorService pool = Executors.newFixedThreadPool(3); SumCallable sc = new SumCallable(100); Future<Integer> fu = pool.submit(sc); Integer integer = fu.get(); System.out.println("结果: " + integer); SumCallable sc2 = new SumCallable(200); Future<Integer> fu2 = pool.submit(sc2); Integer integer2 = fu2.get(); System.out.println("结果: " + integer2); pool.shutdown(); } } SumCallable.java public class SumCallable implements Callable<Integer> { private int n; public SumCallable(int n) { this.n = n; } @Override public Integer call() throws Exception { // 求1-n的和? int sum = 0; for (int i = 1; i <= n; i++) { sum += i; } return sum; } } > 小结:我们发现有了线程池后,线程的操作都是固定的步骤,我们的重点放在任务上.
相关 Java 线程池、Runnable线程池、Callable线程池 线程池: 其实就是一个容纳多个线程的容器,其中的线程可以反复的使用,省去了频繁创建和销毁过程对象的操作,无需反复创建线程面消耗过多资源。 为什么要用线程池: 合理 青旅半醒/ 2023年02月26日 12:30/ 0 赞/ 52 阅读
相关 线程、线程池 创建线程的3种方法: package com.frank.threadPool.createThread; / @author 小石潭记 布满荆棘的人生/ 2022年10月22日 04:27/ 0 赞/ 385 阅读
相关 线程池 1.所谓线程池,就是程序的初始化阶段,就预先创建一批线程,每个线程都做好准备干活; 2.然后有一个任务列表,一开始为空,当有任务来了,就往任务列表里面添加;这个任务列表 痛定思痛。/ 2022年06月13日 13:22/ 0 赞/ 329 阅读
相关 线程池 西施越溪女,明艳光云海 最近用线程池和不用线程池做了个速度的测试,在这里备注下: 结果是速度不相上下; public static void main(Str 妖狐艹你老母/ 2022年05月20日 02:35/ 0 赞/ 283 阅读
相关 线程池 线程池 Java里面线程池的顶级接口是 java.util.concurrent.Executor , 但是严格意义上讲 Executor并不是一个线程池,而只是一个 迈不过友情╰/ 2022年03月06日 14:34/ 0 赞/ 402 阅读
相关 线程池 线程池 > 从字面义上来讲,是指管理一组同构工作线程的资源池。线程池是与工作队列密切相关的,其中在工作队列中(Worker Queue)保存了所有等待执行的任务。工作者( 清疚/ 2021年12月11日 03:35/ 0 赞/ 388 阅读
相关 线程池 可preStart一个或全部core thread 0,小于core则来一个任务建一个线程(firstTask),队列,额外线程,拒绝 一个AtomicInteger的 今天药忘吃喽~/ 2021年11月23日 03:40/ 0 赞/ 412 阅读
相关 线程池 1、先创建线程池 import java.util.concurrent.ArrayBlockingQueue; import java.util.concu 拼搏现实的明天。/ 2021年11月09日 14:28/ 0 赞/ 422 阅读
还没有评论,来说两句吧...