多线程-线程的创建的方式3、4:实现Callable与线程池

news2024/11/25 7:25:08

JDK5.0新增线程创建方式

简要概况:

1. 创建多线程的方式三:实现Callable(jdk5.0新增的)


与之前的方式的对比:与Runnable方式的对比的好处
> call()可以有返回值,更灵活
> call()可以使用throws的方式处理异常,更灵活
> Callable使用了泛型参数,可以指明具体的call()的返回值类型,更灵活

有缺点吗?
如果在主线程中需要获取分线程call()的返回值,则此时的主线程是阻塞状态的。


2. 创建多线程的方式四:使用线程池(现在基础阶段只是了解,以后JUC当中再详细学习)
此方式的好处:
> 提高了程序执行的效率。(因为线程已经提前创建好了)
> 提高了资源的复用率。(因为执行完的线程并未销毁,而是可以继续执行其他的任务)
> 可以设置相关的参数,对线程池中的线程的使用进行管理

新增方式一:实现Callable接口

案例:

package thread.demo06_createmore.callable;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 *  创建多线程的方式三:实现Callable(jdk5.0新增的)
 */

//1.创建一个实现Callable的实现类
class NumThread implements Callable{
    //2. 实现call方法,将此线程需要执行的操作声明在call()中
    @Override
    public Object call() throws Exception {
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            if (i % 2 == 0){
                System.out.println(i);
                sum += i;
            }
            Thread.sleep(100);
        }
        return sum;
    }
}


public class CallableTest {
    public static void main(String[] args) {
        //3. 创建Callable接口实现类的对象
        NumThread numThread = new NumThread();

        //4. 将此Callable接口实现类的对象作为传递到FutureTask构造器中,创建FutureTask的对象
        FutureTask futureTask = new FutureTask(numThread);

        //5. 将FutureTask的对象作为参数传递到Thread类的构造器中,创建Thread对象,并调用start()
        Thread t1 = new Thread(futureTask);
        t1.start();

        try{
            //6. 获取Callable中call方法的返回值
            //get()返回值即为FutureTask构造器参数Callable实现类重写的call()的返回值。
            Object sum = futureTask.get();
            System.out.println("总和为: " + sum);
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

输出:
在这里插入图片描述

新增方式二:实现线程池

现有问题:

如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。

那么,有没有一种办法使得线程可以复用,即执行完一个任务,并不被销毁,而是可以继续执行其他的任务?

**思路:**提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交通工具。

在这里插入图片描述

此方式的好处:

提高了程序执行的效率。(因为线程已经提前创建好了)
提高了资源的复用率。(因为执行完的线程并未销毁,而是可以继续执行其他的任务)
可以设置相关的参数,对线程池中的线程的使用进行管理

案例:

package thread.demo06_createmore.pool;

//创建并使用多线程的第四种方法:使用线程池
//基础阶段只是了解,以后JUC当中再详细学习

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

public class ThreadPool {
    public static void main(String[] args) {
        //1. 提供指定线程数量的线程池
        ExecutorService service = Executors.newFixedThreadPool(10);
        ThreadPoolExecutor service1 = (ThreadPoolExecutor) service;

        //设置线程池的属性
//        System.out.println(service.getClass()); //ThreadPoolExecutor
         service1.setMaximumPoolSize(50); //设置线程池中线程数的上限


        //2.执行指定的线程的操作。需要提供实现Runnable接口或Callable接口实现类的对象
        service.execute(new NumberThread());//适合适用于Runnable
        service.execute(new NumberThread1());//适合使用于Runnable

//        service.submit(Callable callable);//适合适用于Callable

        //3. 关闭连接池
        service.shutdown();
    }
}


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);
            }
        }
    }
}


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.coloradmin.cn/o/650196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模板模式(十六)

相信自己&#xff0c;请一定要相信自己 上一章简单介绍了代理模式(十五), 如果没有看过, 请观看上一章 一. 模板模式 引用 菜鸟教程里面的 模板模式介绍: https://www.runoob.com/design-pattern/template-pattern.html 在模板模式&#xff08;Template Pattern&#xff09;…

简要介绍 | 三维点云配准:理论、方法与挑战

三维点云配准&#xff1a;理论、方法与挑战 注&#xff1a;”简要介绍“系列仅从概念上对某一领域进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解 三维点云配准 是计算机视觉和机器人领域的重要课题&#xff0c;涉及从不同视角或时间点采集的三维点云数据之间寻找最…

面试半年,总结了 1000 道 2023 年 Java 架构师岗面试题

半年前还在迷茫该学什么&#xff0c;怎样才能走出现在的困境&#xff0c;半年后已经成功上岸阿里&#xff0c;感谢在这期间帮助我的每一个人。 面试中总结了 1000 道经典的 Java 面试题&#xff0c;里面包含面试要回答的知识重点&#xff0c;并且我根据知识类型进行了分类&…

Linux5.5 Mysql索引、事务与存储引擎

文章目录 计算机系统5G云计算第四章 LINUX Mysql索引、事务与存储引擎一、Mysql索引1. 索引的概念2.索引的作用3.索引的副作用4.创建索引的原则依据5.索引的分类和创建1&#xff09;普通索引2&#xff09;唯一索引3&#xff09;主键索引4&#xff09;组合索引5&#xff09;全文…

验证attention是否在图像分类问题上起决定性作用

来源&#xff1a;投稿 作者&#xff1a;摩卡 编辑&#xff1a;学姐 Motivation 现阶段出现了大量的Transformer-style图像分类模型&#xff0c;并且这些模型在ImageNet上取得了不俗的成绩&#xff0c;这些Transformer-style模型将取得高性能的功劳归功于Multi-head attention注…

【软件设计】模块设计耦合的其中类型

一.什么是高内聚、低耦合&#xff1f; 在结构化分析与模块设计方法中&#xff0c;模块化是一个很重要的概念&#xff0c;它是将一个待开发的软件分解成为若干个小的模块&#xff0c;每个模块可以独立地开发、测试。使得复杂问题的“分而治之”&#xff0c;令程序的结构清晰、易…

vue3+router4的基本使用

一、安装router npm i vue-router二、路由跳转 2.1 创建路由实例 在src目录下创建router文件夹&#xff0c;在其中创建一个index.js文件&#xff0c;创建路由实例。 通过vue-router的createRouter方法创建一个router对象。其中有history和routes 1.history&#xff1a; histo…

微机保护的数据采集系统(2)

&#xff08;二&#xff09;采样保持电路&#xff08;S&#xff0f;H&#xff09;和模拟低通滤波器&#xff08;ALF&#xff09; 1&#xff0e;采样保持电路&#xff08;S&#xff0f;H&#xff09; &#xff08;1&#xff09;采样保持原理。 S&#xff0f;H电路的作用是在一个…

Linux进程间通信 - 共享内存

之前的文章中我们讲述了匿名管道与命名管道相关的知识点&#xff0c;在本文中我们将继续讲述一种进程间通信的方式&#xff1a;共享内存。 systemV共享内存 共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递不再涉及到…

Downie 4 4.6.18 MAC上最新最好用的一款视频下载工具

Downie for Mac 简介 Downie是Mac下一个简单的下载管理器&#xff0c;可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们。 Downie 4 下载 Downie 4 for Mac Downie 4 for Mac软件特点 支持许多站点 -当前支持1000多个不同的…

间接采购管理中常见的五大挑战

间接采购&#xff0c;有时也被称为间接费用或尾部支出&#xff0c;这些商品或服务不是制造产品直接必需的&#xff0c;而是日常运营所需的。 ● 办公室和行政用品 ● 商店地点的消耗品&#xff08;例如&#xff0c;清洁用品&#xff09; ● 设施管理费用 ● 专业服务 ● 旅行…

Linux 服务器重启之后执行指定脚本文件

有些时候&#xff0c;我们部署服务、中间件、数据库等应用的机器可能会因为机房停电、断电而宕机&#xff0c;这样大部分服务就随之关闭了&#xff0c;可能会需要手动去进行重启&#xff0c;我们可以通过 Linux 的开机启动来实现服务自动重启。 一、配置 /etc/rc.d/rc.local 文…

VOSviewer软件的基础与应用

VOSviewer是一款免费且专业的文献计量分析软件&#xff0c;也是一个知识图谱可视化工具&#xff0c;由荷兰莱顿大学开发&#xff0c;主要用于构建和查看文献计量知识图谱&#xff0c;基于文献的共引和共被引原理&#xff0c;具有可视化能力强、适合于大规模样本数据的特点&…

抖音矩阵系统源代码开发部署--源码搭建

抖音矩阵系统是一个具有强大功能的开放性平台&#xff0c;通过数据挖掘技术能够实现精准的用户画像和个性化推荐&#xff0c;这也是抖音成为国内最受欢迎的短视频平台之一的原因之一。矩阵系统的开发需要大量的技术支持和数据分析&#xff0c;同时也需要综合运用大数据、机器学…

Mysql主从复制及读写分离

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

华为OD机试 JavaScript 实现【密码验证合格程序】【牛客练习题 HJ20】,附详细解题思路

一、题目描述 密码要求: 长度超过8位包括大小写字母.数字.其它符号,以上四种至少三种不能有长度大于2的包含公共元素的子串重复 &#xff08;注&#xff1a;其他符号不含空格或换行&#xff09; 二、输入描述 一组字符串。 三、输出描述 如果符合要求输出&#xff1a;OK&…

A stochastic parrot in every pot 每口锅里都会有一只随机鹦鹉? | 经济学人社论双语精翻

本期双语文章来自《经济学人》2023年5月13日周报社论&#xff1a;《人工智能经济学》&#xff08;The economics of AI&#xff09; A stochastic parrot in every pot? 每口锅里都会有一只随机鹦鹉&#xff1f; What does a leaked Google memo reveal about the future of A…

软文营销,如何写出优质的新闻稿

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 一&#xff0c;什么是软文营销&#xff1f; 软文营销是一种通过撰写和发布具有信息性、有趣性和可读性的文章&#xff0c;来推广产品、服务或品牌的营销策略。软文是指以一种较为隐晦、…

【默认端口】市面上各种中间件、软件、服务的默认端口汇总

常用软件&#xff0c;中间件&#xff0c;服务的默认端口汇总 常用软件默认端口汇总 市面上各种中间件、软件和服务的默认端口众多&#xff0c;下面列举一些常见的默认端口&#xff1a; SSH&#xff08;Secure Shell&#xff09;&#xff1a;22 Telnet&#xff1a;23 FTP…

AI在零售行业的应用

原创 | 文 BFT机器人 如今&#xff0c;零售商已经体验到使用人工智能 (AI) 的诸多好处&#xff0c;随着行业不断创新&#xff0c;人工智能的重要性只会越来越大。随着人工智能越来越被广泛接受&#xff0c;它的实施也越来越广泛。 查看这些用例&#xff0c;了解零售业中的 AI如…