Java创建多线程的8种方式

article/2025/11/8 2:16:02

 

  • 目录

    1、继承Thread类,重写run()方法

    2、实现Runnable接口,重写run()

    3、匿名内部类的方式

    4、带返回值的线程(实现implements  Callable<返回值类型>)————以上3种方式,都没有返回值且都无法抛出异常。

    5、定时器(java.util.Timer)

    6、线程池的实现(java.util.concurrent.Executor接口)

    7、Lambda表达式的实现

    8、Spring实现多线程


  • 1、继承Thread类,重写run()方法

//方式1
package cn.itcats.thread.Test1;public class Demo1 extends Thread{//重写的是父类Thread的run()public void run() {System.out.println(getName()+"is running...");}public static void main(String[] args) {Demo1 demo1 = new Demo1();Demo1 demo2 = new Demo1();demo1.start();demo2.start();}
}
  • 2、实现Runnable接口,重写run()

实现Runnable接口只是完成了线程任务的编写
若要启动线程,需要new Thread(Runnable target),再有thread对象调用start()方法启动线程
此处我们只是重写了Runnable接口的Run()方法,并未重写Thread类的run(),让我们看看Thread类run()的实现
本质上也是调用了我们传进去的Runnale target对象的run()方法

//Thread类源码中的run()方法
//target为Thread 成员变量中的 private Runnable target;@Overridepublic void run() {if (target != null) {target.run();}}

所以第二种创建线程的实现代码如下:

package cn.itcats.thread.Test1;/*** 第二种创建启动线程的方式* 实现Runnale接口* @author fatah*/
public class Demo2 implements Runnable{//重写的是Runnable接口的run()public void run() {System.out.println("implements Runnable is running");}public static void main(String[] args) {Thread thread1 = new Thread(new Demo2());Thread thread2 = new Thread(new Demo2());thread1.start();thread2.start();}}

实现Runnable接口相比第一种继承Thread类的方式,使用了面向接口,将任务与线程进行分离,有利于解耦

  • 3、匿名内部类的方式

适用于创建启动线程次数较少的环境,书写更加简便
具体代码实现:

package cn.itcats.thread.Test1;
/*** 创建启动线程的第三种方式————匿名内部类* @author fatah*/
public class Demo3 {public static void main(String[] args) {//方式1:相当于继承了Thread类,作为子类重写run()实现new Thread() {public void run() {System.out.println("匿名内部类创建线程方式1...");};}.start();//方式2:实现Runnable,Runnable作为匿名内部类new Thread(new Runnable() {public void run() {System.out.println("匿名内部类创建线程方式2...");}} ).start();}
}
  • 4、带返回值的线程(实现implements  Callable<返回值类型>)

以上两种方式,都没有返回值且都无法抛出异常。
Callable和Runnbale一样代表着任务,只是Callable接口中不是run(),而是call()方法,但两者相似,即都表示执行任务,call()方法的返回值类型即为Callable接口的泛型
具体代码实现:

package cn.itcats.thread.Test1;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.RunnableFuture;/*** 方式4:实现Callable<T> 接口* 含返回值且可抛出异常的线程创建启动方式* @author fatah*/
public class Demo5 implements Callable<String>{public String call() throws Exception {System.out.println("正在执行新建线程任务");Thread.sleep(2000);return "新建线程睡了2s后返回执行结果";}public static void main(String[] args) throws InterruptedException, ExecutionException {Demo5 d = new Demo5();/*	call()只是线程任务,对线程任务进行封装class FutureTask<V> implements RunnableFuture<V>interface RunnableFuture<V> extends Runnable, Future<V>*/FutureTask<String> task = new FutureTask<>(d);Thread t = new Thread(task);t.start();System.out.println("提前完成任务...");//获取任务执行后返回的结果String result = task.get();System.out.println("线程执行结果为"+result);}}
  • 5、定时器(java.util.Timer)

关于Timmer的几个构造方法


执行定时器任务使用的是schedule方法:


具体代码实现:

package cn.itcats.thread.Test1;import java.util.Timer;
import java.util.TimerTask;/*** 方法5:创建启动线程之Timer定时任务* @author fatah*/
public class Demo6 {public static void main(String[] args) {Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("定时任务延迟0(即立刻执行),每隔1000ms执行一次");}}, 0, 1000);}}

我们发现Timer有不可控的缺点,当任务未执行完毕或我们每次想执行不同任务时候,实现起来比较麻烦。这里推荐一个比较优秀的开源作业调度框架“quartz”,在后期我可能会写一篇关于quartz的博文。

  • 6、线程池的实现(java.util.concurrent.Executor接口)

降低了创建线程和销毁线程时间开销和资源浪费
具体代码实现:

package cn.itcats.thread.Test1;import java.util.concurrent.Executor;
import java.util.concurrent.Executors;public class Demo7 {public static void main(String[] args) {//创建带有5个线程的线程池//返回的实际上是ExecutorService,而ExecutorService是Executor的子接口Executor threadPool = Executors.newFixedThreadPool(5);for(int i = 0 ;i < 10 ; i++) {threadPool.execute(new Runnable() {public void run() {System.out.println(Thread.currentThread().getName()+" is running");}});}}
}

运行结果:
pool-1-thread-3 is running
pool-1-thread-1 is running
pool-1-thread-4 is running
pool-1-thread-3 is running
pool-1-thread-5 is running
pool-1-thread-2 is running
pool-1-thread-5 is running
pool-1-thread-3 is running
pool-1-thread-1 is running
pool-1-thread-4 is running

运行完毕,但程序并未停止,原因是线程池并未销毁,若想销毁调用threadPool.shutdown();    注意需要把我上面的
Executor threadPool = Executors.newFixedThreadPool(10);              改为  
ExecutorService threadPool = Executors.newFixedThreadPool(10);     否则无shutdown()方法

若创建的是CachedThreadPool则不需要指定线程数量,线程数量多少取决于线程任务,不够用则创建线程,够用则回收。

  • 7、Lambda表达式的实现(parallelStream)

    package cn.itcats.thread.Test1;import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;/*** 使用Lambda表达式并行计算* parallelStream* @author fatah*/
    public class Demo8 {public static void main(String[] args) {List<Integer> list = Arrays.asList(1,2,3,4,5,6);Demo8 demo = new Demo8();int result = demo.add(list);System.out.println("计算后的结果为"+result);}public int add(List<Integer> list) {//若Lambda是串行执行,则应顺序打印list.parallelStream().forEach(System.out :: println);//Lambda有stream和parallelSteam(并行)return list.parallelStream().mapToInt(i -> i).sum();}
    }
    

    运行结果:
    4
    1
    3
    5
    6
    2
    计算后的结果为21
    事实证明是并行执行
     

  • 8、Spring实现多线程

(1)新建Maven工程导入spring相关依赖
(2)新建一个java配置类(注意需要开启@EnableAsync注解——支持异步任务)

package cn.itcats.thread;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;@Configuration
@ComponentScan("cn.itcats.thread")
@EnableAsync
public class Config {}

(3)书写异步执行的方法类(注意方法上需要有@Async——异步方法调用)

package cn.itcats.thread;import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;@Service
public class AsyncService {@Asyncpublic void Async_A() {System.out.println("Async_A is running");}@Asyncpublic void Async_B() {System.out.println("Async_B is running");}
}

(4)创建运行类

package cn.itcats.thread;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Run {public static void main(String[] args) {//构造方法传递Java配置类Config.classAnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(Config.class);AsyncService bean = ac.getBean(AsyncService.class);bean.Async_A();bean.Async_B();}
}

 


http://chatgpt.dhexx.cn/article/rF8TOGcq.shtml

相关文章

java如何创建线程

java如何创建线程 1. java如何创建线程1.1 通过继承Thread类来创建线程1.2 通过实现Runnable接口来创建线程1.3 通过匿名内部类来创建线程1.4 lambda表达式1.5 通过实现Runnable接口的方式创建线程目标类的优缺点 1. java如何创建线程 一个线程在Java中使用一个Thread实例来描…

Java多线程 - Java创建线程的4种方式

文章目录 1. Java创建线程有哪几种方式&#xff1f;1.1 线程创建方法一&#xff1a;继承Thread类创建线程类1.2 线程创建方法二&#xff1a;实现Runnable接口创建线程目标类1.5 线程创建方法三&#xff1a;使用Callable和FutureTask创建线程1.6 线程创建方法四&#xff1a;通过…

java创建线程的四种方式

1&#xff09;继承Thread类创建线程 如图所示: //继承Thread类 class Aclass extends Thread{//输出100以内的偶数Overridepublic void run() {for (int i 1; i <100; i) {System.out.println(getName()":"i);}} } 测试: Thread t1 new Aclass();t1.setName…

Java创建线程的七种方法,全网最全面总结~

目录 前言 一、继承Thread&#xff0c;重写run方法 二、实现Runnable接口&#xff0c;重写run方法 三、使用匿名内部类创建 Thread 子类对象 四、使用匿名内部类&#xff0c;实现Runnable接口 五、lambda表达式 六、实现Callable接口 七、使用线程池创建线程 前言 属于基…

java创建线程(Thread)的5种方式

java创建线程&#xff08;Thread&#xff09;的5种方式 方式一&#xff1a;继承于Thread类方式二&#xff1a;实现Runnable接口方式三&#xff1a;实现Callable接口方式四&#xff1a;使用线程池方式五&#xff1a;使用匿名类 方式一&#xff1a;继承于Thread类 步骤&#xff1…

前端开发与vscode开发工具介绍

文章目录 1、前端开发2、vscode安装和使用2.1、下载地址2.2、插件安装2.3、设置字体大小2.4、开启完整的Emmet语法支持2.5、创建项目2.6、保存工作区2.7、新建文件夹和网页 1、前端开发 前端工程师“Front-End-Developer”源自于美国。大约从2005年开始正式的前端工程师角色被…

IntelliJ IDE 插件开发指南

作者介绍 洪进锋&#xff0c;字节跳动后端研发工程师&#xff0c;参与过高并发系统&#xff08;百万QPS&#xff09;设计与研发工作。在开源项目方面混过 Sharding-JDBC 的 PR。个人开发的 IntelliJ IDE 插件 Redis Manager&#xff0c;目前在官方插件库中下载量 30K&#xff0…

真的要转到云IDE了吗?VS Code的开源IDE

云IDE产品介绍 云IDE使用教程 免费使用地址&#xff1a;点击【云IDE】&#xff0c;即可开始创建工作空间啦~ 前言 CSDN最新产品【云IDE】来啦&#xff01;【云IDE】将为各位技术er一键秒级构建云开发环境&#xff0c;提升开发效率&#xff01; 1. 什么是IDE&#xff1f; 做…

编辑器和IDE到底有什么区别呢?

其实很多接触了开发的工作人员都会接触以上 两种工具&#xff0c;编辑器&#xff0c;IDE。 其实我最刚开始的时候真的分不清&#xff0c;感觉都是开发的&#xff0c;上班以后呢慢慢就发现了两者的不同。 刚刚看知乎&#xff0c;发现一位哥们说话挺有意思的&#xff0c;比喻也…

初识Node.js之IDE的选择

其实就如同Java一样&#xff0c;Node可以选择的IDE不止一种&#xff0c;常见的比如webstorm&#xff0c;Visual Studio Code&#xff0c;其实都可以应付日常的工作需求&#xff0c;今天我要介绍的IDE&#xff0c;其实就是Visual Studio Code(接下来简称vs code)。怎么评价vs co…

【编辑器】VSCode的Web前端(html,css,JavaScript)开发环境打造

1、安装VScode和浏览器 VScode安装&#xff1a;https://code.visualstudio.com/ Chrome安装&#xff1a;https://www.google.com/intl/zh-CN/chrome/ node.js 安装&#xff1a;https://nodejs.org/zh-cn/download/ Web前端开发主要包括html&#xff0c;css&#xff0c;JavaScr…

IDE集成开发工具-IDEA(一)之IDE的概念

IDE的概念 集成开发环境&#xff08;IDE&#xff0c;Integrated Development Environment &#xff09;是用于提供程序开发环境的应用程序&#xff0c;一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开…

11个裸VSCode必备插件,助你打造一个前端开发IDE

VSCode 轻量、开源&#xff0c;新鲜下载的 VSCode 可谓是身无长物、一穷二白&#xff0c;连个项目管理的功能都没有。 身轻如燕的 VSCode 对于后端开发说可能有点幼稚&#xff0c;但对于前端来说刚刚好&#xff0c;毕竟不需要搞什么 Docker、数据库等等&#xff0c;装俩 VSCod…

「干货」前端开发者最常用的六款IDE

微信公众号&#xff1a;javafirst 一、Visual Studio Code 下载地址&#xff1a;https://code.visualstudio.com/ 功能介绍&#xff1a; 微软在2015年4月30日Build 开发者大会上正式宣布了 Visual Studio Code 项目&#xff1a;一个运行于 Mac OS X、Windows和 Linux 之上的…

IDEA使用前端基础

常用快捷键和快捷语句 CtrlShiftEnter&#xff1a;将输入的if、for、函数等等补上{}或者;使代码语句完整 CtrlAltT&#xff1a;将选中的代码使用if、while、try/catch等包装 Alt/&#xff1a;自动完成 AltEnter&#xff1a;自动提示完成 Ctrl/&#xff1a;使用//进行注释 Ctrl…

IDE的详细介绍

IDE&#xff08;集成开发环境&#xff09; 就是电脑上编程时用的应用&#xff0c;比如&#xff1a;visual studio&#xff08;如图&#xff09;&#xff0c; eclipse等。IDE一般包括&#xff1a;代码编辑器、编译器、调试器和图形用户界面等工具。IDE是集成了代码编写功能、分…

IDE等开发工具的使用(VSCODE + IDEA)

Mac下各按键对应含义 ⌥ ⌃⇧⌘→ / ← ↑ / ↓ 各种快捷键的组合场景 左ctrl 待定 左alt cmd 待定 左ctrl shift 待定 左ctrl cmd 待定 左shift cmd 待定 1.熟悉的Mac下的快捷键&#xff08;持续补充&#xff09; 附&#xff1a;Vscode KeyShortCut 功能 快捷键 功能…

【HBuilder】前端IDE神器

Hbulider目录 一、Hbulider简介1.1 Hbulider出身1.2 Hbulider特点 二、Hbulider安装2.1 Hbulider官网下载2.2 解压&#xff0c;发送快捷方式到桌面 三、Hbulider启动3.1 选择主题和快捷键方案 四、Hbulider使用4.1 失去焦点自动保存 一、Hbulider简介 1.1 Hbulider出身 HBuild…

前端vscode必备插件(强烈推荐)

目录 一、前言 二、工具推荐 1.《Chinese (Simplified) (简体中文) Language》 2.《ESLint》 3.《Git History》 4.vscode-icons 5.Path Intellisense 6.《Vetur》 7.《GitLens — Git supercharged》 8.《Image preview》 9.Debugger for Chrome 10.Prettier 11…

前端开发IDE---VSCode前端开发环境配置

所安装的插件如下&#xff1a; 1、open in browser(2.0.0版本&#xff09;详细内容见VSCode插件搜索。 修改默认浏览器的步骤&#xff1a; File>preferences>settings>点击那三个点>选择open settings.json>找到plugin open-in-browser按照提示在右边的json文…