博客
关于我
Day65.创建多线程的方式四-实现Callable接口与使用线程池方式 -Java多线程
阅读量:337 次
发布时间:2019-03-04

本文共 3102 字,大约阅读时间需要 10 分钟。

创建多线程的方式四: 实现Callable接口与使用线程池方式

.

实现Callable接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-obQWSp30-1602159720792)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201008184444899.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4v3hcRpY-1602159720795)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201008191040707.png)]

/** * 创建线程方式四: 实现Callable接口。  ---  jdk 5.0 新增 *  1. 创建一个实现Callable的实现类 *  2. 重写call()方法,将此线程需要执行的操作声明在call()中。 *  3. 创建Callable接口实现类的对象 *  4. 将此Callable接口实现类的对象作为参数传递到FutureTask构造器中,创建FutureTask对象 *  5. 将FutureTask的对象作为参数传递到Thread类的构造器中,创建Thread对象,并调用start() *  6. 获取Callable中的call()的返回值 * * 问题:  如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程强大? *      1. call()可以有返回值。 *      2. call()可以抛出异常,被外面的操作捕获,获取异常的信息 *      3. Callable是支持泛型 * * @author 阿昌 * @create 2020-10-08 19:02 *///1. 创建一个实现Callable的实现类class NumThread implements Callable{       //2. 重写call()方法,将此线程需要执行的操作声明在call()中。    @Override    public Object call() throws Exception {           int sum = 0;        for (int i = 0; i <= 100; i++) {               if (i % 2 ==0){                   System.out.println(i);                sum += i;            }        }        return sum;    }}public class ThreadNew {       public static void main(String[] args) {           //3. 创建Callable接口实现类的对象        NumThread numThread = new NumThread();        //4. 将此Callable接口实现类的对象作为参数传递到FutureTask构造器中,创建FutureTask对象        FutureTask f = new FutureTask
(numThread); //5. 将FutureTask的对象作为参数传递到Thread类的构造器中,创建Thread对象,并调用start() new Thread(f).start(); Object o = null; try { //6. 获取Callable中的call()的返回值 //get()的返回值 即为FutureTask构造器参数Callable实现类重写的call()的返回值。 o = f.get(); System.out.println("总合为: "+ o); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } }}

.

使用线程池方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BeqRvnuM-1602159720796)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201008194037801.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9CwmxQpu-1602159720799)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201008194049152.png)]

/** * 创建线程的方式四: 使用线程池 *  1. 提供指定线程数量的线程池 *  2. 执行指定的线程操作。 需要提供提示Runnable接口或Callable接口实现类的对象 *  3. 关闭连接池 * *  好处: *      1. 提高响应效率(减小创建新线程的时间) *      2. 降低资源的消耗(重复利用,而不是再造) *      3. 便于线程的管理 *          corePoolSize: 核心池的大小 *          maximumPoolSize: 最大线程数 *          keepAliveTime: 线程没有任务时最多保持多长时间会终止 *          ... *  面试题: 创建多线程有几种方式? *      4种; Thread类继承, * 			 Runnable类接口实现, *           Callable接口实现 *           线程池 * * * @author 阿昌 * @create 2020-10-08 19:48 */class NumberThread implements Runnable{       @Override    public void run() {           for (int i = 0; i <= 100; i++) {               if (i % 2 ==0){                   System.out.println(Thread.currentThread().getName()+": "+ i );            }        }    }}public class ThreadPool {       public static void main(String[] args) {           //1. 提供指定线程数量的线程池        ExecutorService executorService = Executors.newFixedThreadPool(10);        //2. 执行指定的线程操作。 需要提供提示Runnable接口或Callable接口实现类的对象        executorService.execute(new NumberThread());//适合使用于Runnable        executorService.execute(new NumberThread1());        //executorService.submit();//适合使用于Callable        //3. 关闭连接池        executorService.shutdown();    }}class NumberThread1 implements Runnable{       @Override    public void run() {           for (int i = 0; i <= 100; i++) {               if (i % 2 !=0){                   System.out.println(Thread.currentThread().getName()+": "+ i );            }        }    }}

转载地址:http://vyoq.baihongyu.com/

你可能感兴趣的文章
MySQL 中随机抽样:order by rand limit 的替代方案
查看>>
MySQL 为什么需要两阶段提交?
查看>>
mysql 为某个字段的值加前缀、去掉前缀
查看>>
mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
查看>>
mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
查看>>
mysql 主键重复则覆盖_数据库主键不能重复
查看>>
Mysql 优化 or
查看>>
mysql 优化器 key_mysql – 选择*和查询优化器
查看>>
MySQL 优化:Explain 执行计划详解
查看>>
Mysql 会导致锁表的语法
查看>>
mysql 使用sql文件恢复数据库
查看>>
mysql 修改默认字符集为utf8
查看>>
Mysql 共享锁
查看>>
MySQL 内核深度优化
查看>>
mysql 内连接、自然连接、外连接的区别
查看>>
mysql 写入慢优化
查看>>
mysql 分组统计SQL语句
查看>>
Mysql 分页
查看>>
Mysql 分页语句 Limit原理
查看>>
MySQL 创建新用户及授予权限的完整流程
查看>>