实现多线程方式你知道几种?

news2024/11/15 11:01:50

实现多线程通常有以下四种方式:

  • 继承 Thread 类。
  • 实现 Runnable 接口。
  • 实现 Callable 接口。
  • 线程池实现多线程。

继承 Thread 类:

public class ThreadDemo extends Thread{

    @Override
    public void run(){
        System.out.println("Thread 类实现多线程,线程名称:"+Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        ThreadDemo threadDemoOne=new ThreadDemo();
        threadDemoOne.start();
        ThreadDemo threadDemoTwo=new ThreadDemo();
        threadDemoTwo.start();
    }
}

运行结果:

Thread 类实现多线程,线程名称:Thread-1
Thread 类实现多线程,线程名称:Thread-0

继承 Thread 类实现多线程的优缺点:

  • 优点:实现简单,只需要继承 Thread 类,实现 run 方法即可,实际启动线程还是使用 start 方法,start() 方法是一个 native 方法,它将启动一个新线程,并执行 run() 方法。
  • 缺点:我们知道 Java 的单继承的,如果类已经继承了其他的类则不能继承 Thread 类,而且也不能获取线程的返回值。

Thread 类本质上是实现了 Runnable 接口,如下:
在这里插入图片描述

实现 Runnable 接口:

public class RunnableDemo implements Runnable {

    @Override
    public void run() {
        System.out.println("实现 Runnable 接口实现多线程,线程名称:" + Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        System.out.println("当前线程名称:" + Thread.currentThread().getName());
        Thread thread = new Thread(new RunnableDemo());
        thread.start();
    }

}

执行结果:

当前线程名称:main
实现 Runnable 接口实现多线程,线程名称:Thread-0

实现 Runnable 接口实现多线程的优缺点:

  • 优点:实现简单,实现 Runnable 接口,重写 run 方法即可。
  • 缺点:每次创建一个线程就必须创建一个 Runnable 的实现类,而且也不能获取线程的返回值。

实现 Callable 接口:

public class CallableDemo implements Callable<String> {
    @Override
    public String call() throws Exception {
        System.out.println("当前线程的名称是:" + Thread.currentThread().getName());
        return "返回值";
    }

    public static void main(String[] args) {
        FutureTask<String> futureTask = new FutureTask<>(new CallableDemo());
        System.out.println("准备开始启动线程,当前线程的名称是:" + Thread.currentThread().getName());
        new Thread(futureTask).start();
        try {
            String str = futureTask.get();
            System.out.println("线程的返回值:" + str);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

执行结果:

准备开始启动线程,当前线程的名称是:main
当前线程的名称是:Thread-0
线程的返回值:返回值

实现 Callable 接口实现多线程的优缺点:

  • 优点:可以获取多线程的返回值,这是前面两种实现多线程的方法做不到的事情。
  • 缺点:每次创建一个线程就必须创建一个 Callable 的实现类。

线程池实现多线程:

public class ExecutorServiceDemo {

    public static void main(String[] args) {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(4);
        executor.setMaxPoolSize(8);
        executor.setQueueCapacity(100);
        executor.setKeepAliveSeconds(60);
        executor.setThreadNamePrefix("executorService-");
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.initialize();
        for (int a = 0; a < 10; a++) {
            executor.execute(() -> {
                System.out.println("当前线程名称:" + Thread.currentThread().getName());
            });
        }
    }

}

执行结果:

当前线程名称:executorService-2
当前线程名称:executorService-3
当前线程名称:executorService-4
当前线程名称:executorService-4
当前线程名称:executorService-4
当前线程名称:executorService-4
当前线程名称:executorService-4
当前线程名称:executorService-1
当前线程名称:executorService-3
当前线程名称:executorService-2

使用线程池实现多线程的优点:

  • 使用线程池实现多线程,可以实现线程的重复使用,就可以避免因线程创建销毁带来的资源消耗。
  • 提高响应速度,因为线程池的线程是创建好了的,故任务一到达马上就可以开始执行。
  • 使用线程池可以提高线程的可控性,线程的创建和销毁不仅会增加系统的消耗,同时如果线程创建不当,会降低系统的额稳定性,线程池可以对线程进行统一管理。

如有错误的地方欢迎指出纠正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1545545.html

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

相关文章

现在的市场对 C++ 的需求大吗?

先说结论&#xff1a;需求还是很大&#xff0c;但是没有什么初级程序员能干的岗位。 游戏引擎&#xff0c;存储&#xff0c;推荐引擎&#xff0c;infra&#xff0c;各种各样的性能敏感场景。 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;…

Linux系统服务

文章目录 什么是daemon与服务(service)systemd使用unit分类 通过systemctl管理服务通过systemctl管理单一服务(service unit)通过systemctl查看系统上所有的服务通过systemctl管理不同的操作环境(target unit)通过systemctl分析各服务之间的依赖性与systemd的daemon运行过程相关…

基于nodejs+vue铁路订票管理系统python-flask-django-php

该铁路订票管理系统采用前后端分离进行设计&#xff0c;并采用nodejs语言以及express框架进行开发。本系统主要设计并完成了用户登录管理过程、个人信息修改、用户管理、火车类型管理、火车信息管理、车票预订管理、车票退票管理、系统管理等功能。该系统操作简单&#xff0c;界…

考研数学|武忠祥高数全年学习包分享

u1s1&#xff0c;武忠祥老师的课程真的不错&#xff0c;宝藏级老师 其实我觉得没必要对比每一个考研数学老师&#xff0c;汤家凤还有张宇以及武忠祥都是非常受欢迎的老师&#xff0c;也都很有实力&#xff0c;只不过讲课的风格有所区别。 比如汤家凤老师就像是高中那种不苟言…

2024华为产业链企业名单大全(附下载)

更多内容&#xff0c;请前往知识星球下载&#xff1a;https://t.zsxq.com/18fsVdcjA 更多内容&#xff0c;请前往知识星球下载&#xff1a;https://t.zsxq.com/18fsVdcjA

mapbox测距功能重写

// 使用 import MeatureTool from "/components/webgisMap/measureTool";measureDistance() {// ID可以自定义const layerId String(new Date().getTime())this.meatureTool new MeatureTool(this.mapBoxMap)this.meatureTool.measureDistance(layerId)// 防止函数…

动态内存管理-传值调用错题解析

首先我们来看这个错误代码 首先我们看代码逻辑&#xff0c;首先main函数调用test&#xff0c;test接收的是void类型&#xff0c;设置一个指针变量&#xff0c;指向null&#xff0c;传递给get函数&#xff0c;也就是传递一个空指针给getmemory函数&#xff0c;这个函数接收了&a…

单片机入门到精通:一站式在线学习平台!

介绍&#xff1a;单片机&#xff0c;也称为微控制器&#xff08;MCU&#xff09;&#xff0c;是一种集成了中央处理器&#xff08;CPU&#xff09;、随机存储器&#xff08;RAM&#xff09;、只读存储器&#xff08;ROM&#xff09;以及输入/输出接口于单一芯片上的微型计算机。…

设计模式学习笔记 - 设计模式与范式 -结构型:2.桥接模式:如何实现支持不同类型和渠道的消息推送系统?

概述 今天学习另外一种结构型模式&#xff1a;桥接模式。桥接模式的代码实现非常简单&#xff0c;但是理解起来稍微优点难度&#xff0c;并且应用场景也比较局限&#xff0c;所以&#xff0c;相对于代理模式来说&#xff0c;桥接模式在实际的项目中并没有那么常用&#xff0c;…

Spring文件配置以及获取

前言 我们都知道很多应用都是有配置文件的,可以对应用的一些参数进行配置,如conf... 本篇我们讲解关于Spring的配置文件以及程序怎么获取其中写入的参数 Spring中的配置文件主要有三种 还有yml和ymal文件 下面我们将介绍关于常用的两种 preoperties 和 yml文件的格式和读取…

2024年适合个人和普通企业用户的阿里云服务器推荐,最低仅需61元1年

现在不论是个人还是企业&#xff0c;只要有建站&#xff0c;做APP&#xff0c;存储数据等需要就需要一台云服务器。通常来说&#xff0c;购买阿里云服务器的用户主要分为三类&#xff1a;一是个人用户&#xff0c;二是普通企业用户&#xff0c;三是对云服务器性能有特殊需求的集…

libVLC 视频缩放

libvlc是一个常用的开源多媒体框架&#xff0c;它可以用来播放和处理各种类型的音频和视频文件。如果想要缩放视频&#xff0c;可以通过libvlc提供的API来实现。 //设置视频的缩放比例。 libvlc_video_set_scale() 以下是如何使用 libVLC 设置视频缩放的基本步骤&#xff1a;…

【研发管理】研发管理规范

研发管理规范 目的定义工作职责产品经理项目经理运维负责人研发负责人研发工程师 基本原则研发过程描述需求分析分析设计研发实现测试验收发布上线线上监控 目的 软件研发相关管理&#xff0c;有效控制技术风险&#xff0c;提高研发和运行质量 定义 包括需求分析、分析设计…

智慧公厕的全域感知、全网协同、全业务融合和全场景智慧赋能

公共厕所是城市的重要组成部分&#xff0c;为市民提供基本的生活服务。然而&#xff0c;传统的公厕管理模式存在诸多问题&#xff0c;如排队等候时间长、卫生状况差、空气质量差等&#xff0c;严重影响市民的出行和生活质量。为了解决这些问题&#xff0c;智慧公厕应运而生&…

WebClient上载文件——实现将本地文件同步到远端服务器上

问题描述 用户上传产品示例图片到服务器端上&#xff0c;客户端在请求图片资源时&#xff0c;当服务端架设了多个节点的情况下&#xff0c;由于没有负载均衡请求到保存图片资源的服务器&#xff0c;出现图片访问404的问题。 这里保存上传文件时&#xff0c;同时需要将该文件保…

【学习心得】神经网络知识中的符号解释

这里我对我学到的神经网络知识中&#xff0c;常见的符号做一下记录和总结&#xff0c;方便自己在后面学习中复习。下图二分类识别图像识别猫为例。为了保存一张图片&#xff0c;需要三个矩阵&#xff0c;它们分别对应图片中的红、绿、蓝三种颜色通道&#xff0c;如果图片大小为…

vitepress builld报错

问题&#xff1a;build时报错&#xff1a;document/window is not defined。 背景&#xff1a;使用vitepress展示自定义的组件&#xff0c;之前build是没有问题了&#xff0c;由于新增了qr-code以及quill富文本组件&#xff0c;导致打包时报错。 原因&#xff1a;vitepress官…

邮件接口与第三方平台的集成的方式有哪些?

邮件接口如何实现高效通信&#xff1f;怎么有效地利用邮件接口&#xff1f; 邮件接口与第三方平台的集成已经成为了企业提升工作效率、优化用户体验的关键环节。那么&#xff0c;邮件接口与第三方平台的集成方式究竟有哪些呢&#xff1f;接下来&#xff0c;AokSend就来探讨一下…

力扣由浅至深 每日一题.15 删除排序链表中的重复元素

没关系的&#xff0c;昨天的暴雨不会淋湿今天的自己 —— 24.3.26 删除排序链表中的重复元素 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出…

VR全景展示:传统制造业如何保持竞争优势?

在结束不久的两会上&#xff0c;数字化经济和创新技术再度成为了热门话题。我国制造产业链完备&#xff0c;但是目前依旧面临着市场需求不足、成本传导压力加大等因素影响&#xff0c;那么传统制造业该如何保持竞争优势呢&#xff1f; 在制造行业中&#xff0c;VR全景展示的应用…