rinetd Appuim环境搭建 mysql properties volatile 金融信贷 forms file soap Component NEC vue下载 seo教程下载 jq遍历元素 js键值对数组 python程序界面 微信pc版无法获取二维码 excel动态图表制作 kb转mb vue使用bootstrap python自学教程 python学习入门 python开发界面 python中的join函数 python函数返回 python零基础 python用什么数据库 java案例 java集合框架 java手册 java中获取当前时间 java格式化日期 nginx安装教程 0x0000004e alphacam kms神龙 电脑cmd命令大全 挑战程序设计竞赛 cad自动保存位置 js刷新当前页面
当前位置: 首页 > 学习教程  > 编程语言

Day65.创建多线程的方式四-实现Callable接口与使用线程池方式 -Java多线程

2020/10/8 20:27:55 文章标签:

创建多线程的方式四: 实现Callable接口与使用线程池方式 . 实现Callable接口 /*** 创建线程方式四: 实现Callable接口。 --- jdk 5.0 新增* 1. 创建一个实现Callable的实现类* 2. 重写call()方法,将此线程需要执行的操作声明在call()中。* 3. 创建Callable接…

创建多线程的方式四: 实现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<Integer>(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接口实现
 *           实例化ReentrantLock-Lock实现
 *           线程池
 *
 *
 * @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://www.dtmao.cc/news_show_250309.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?