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

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

目录

前言

一、继承Thread,重写run方法

二、实现Runnable接口,重写run方法

三、使用匿名内部类创建 Thread 子类对象

四、使用匿名内部类,实现Runnable接口

五、lambda表达式

六、实现Callable接口

七、使用线程池创建线程


前言

        属于基础的面试问题,一定要能够回答全哦~


一、继承Thread,重写run方法

        通过自定义一个类(这里起名为:MyThread),继承Thread类,重写run方法,最后在main方法中new出MyThread实例,调用这个实例的继承的Thread类的start方法创建一个线程。

Ps:

1.创建出MyThread实例,并不代表在系统真的创建一个线程,只有调用start方法时,才创建出一个新的线程,新线程会执行run里的逻辑,直到run里逻辑执行完,线程就结束了;

2.运行一次Java程序就启动了一个进程,一个进程里至少会有一个线程,这里JVM默认创建的线程就是main线程(主线程),main主线程和MyThread创建出来的新线程是“并发执行”的关系(并发+并行),也可以理解为同时执行,各执行各的;

3.直接调用run并没有创建线程,只是在原来的线程中执行代码;

代码如下:

class MyThread extends Thread {@Overridepublic void run() {System.out.println("继承Thread,重写run方法创建线程");}
}public class Main {public static void main(String[] args) {MyThread myThread = new MyThread();myThread.start();}
}

二、实现Runnable接口,重写run方法

        通过自定义一个类(这里起名为:MyRunnable)实现Runnable接口,重写run方法,最后在main方法new出MyRunnable实例和Thread实例,最后通过start方法创建并启动线程。

通俗理解:

这里相当于把线程要干的活和线程本身分离开了,使用MyRunnable这个自定义的类来表示“线程要完成的任务”,这样做的目的就是为了“解耦合”,假设未来有新的任务需要线程去执行,那么通过这种方式,代码改动就比较小。

代码如下:

class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("实现Runnable接口,重写run方法");}
}public class Main {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start();}
}

三、使用匿名内部类创建 Thread 子类对象

        直接创建Thread子类,同时实例化出一个对象,重写run方法,最后通过start方法创建并启动线程。

代码如下:

public class Main {public static void main(String[] args) {Thread thread = new Thread() {@Overridepublic void run() {System.out.println("使用匿名内部类创建 Thread 子类对象");}};thread.start();}
}

四、使用匿名内部类,实现Runnable接口

        通过使用使用匿名内部类,实现Runnable接口作为Thread构造方法的参数,最后通过start创建并启动线程;

代码如下:

public class Main {public static void main(String[] args) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("使用匿名内部类,实例Runnable接口作为构造参数");}});thread.start();}
}

五、lambda表达式

        lambda本质上就是一个“匿名函数”,()表示函数的形参,{}表示函数体,->特殊语法,表示它是lambda表达式(->是从C++那里抄来的)。

代码如下:

public class Main {public static void main(String[] args) {Thread thread = new Thread(() -> {System.out.println("使用lambda表示创建线程");});thread.start();}}

六、实现Callable接口

        通过自定义类(这里起名为:MyCallable),实现Callable接口,重写call方法(call方法可以理解为线程需要执行的任务),并且带有返回值,这个返回表示一个计算结果,如果无法计算结果,则引发Exception异常,如下源码英文解释:

        接着创建Callable实例,使用FutrueTast类包装Callable对象,FutureTask是一个包装器,需要接收Callable实例来创建,并且有两个构造函数,一个参数只有Callable对象,另一个参数不仅有Callable对象,还有一个泛型的result参数,详细解释如下源码:

最后使用FutureTask对象作为Thread的构造参数,通过start方法创建并启动线程;

注意:这里可以用get方法获取线程执行后的返回值。

代码如下:

class MyCallableTest implements Callable<Integer> {@Overridepublic Integer call() throws Exception {System.out.println("创建线程:" + Thread.currentThread().getName());return 2;}
}public class Main {public static void main(String[] args) throws ExecutionException, InterruptedException {FutureTask<Integer> task = new FutureTask<>(new MyCallableTest());Thread thread = new Thread(task);thread.start();System.out.println("创建线程的返回结果为:" + task.get());}}

七、使用线程池创建线程

        在Java中,线程池的本体叫ThreadPoolExecutor,他的构造方法写起来十分麻烦,为了简化构造方法,标准库就提供了一系列工厂方法,简化使用;

什么是工厂模式?

        工厂模式,将创建产品实例的权利移交工厂,我们不再通过new来创建我们所需的对象,而是通过工厂来获取我们需要的产品。降低了产品使用者与使用者之间的耦合关系;

也就是说这里创建线程池没有显式new,而是通过Executors这个静态方法newCaChedThreadPool来完成的;

常见用法:

        线程池的单纯使用很简单,使用submit方法,把任务提交到线程池中即可,线程池中会有线程来完成这些任务;

代码如下:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Pool {public static void main(String[] args) {ExecutorService pool = Executors.newCachedThreadPool();pool.submit(new Runnable() {@Overridepublic void run() {//执行业务逻辑for(int i = 1; i <= 100; i++) {System.out.println("线程:" + Thread.currentThread().getName() + "执行了任务" + i + "~");}}});pool.submit(new Runnable() {@Overridepublic void run() {//执行业务逻辑for(int i = 101; i <= 200; i++) {System.out.println("线程:" + Thread.currentThread().getName() + "执行了任务" + i + "~");}}});pool.submit(new Runnable() {@Overridepublic void run() {//执行业务逻辑for(int i = 201; i <= 300; i++) {System.out.println("线程:" + Thread.currentThread().getName() + "执行了任务" + i + "~");}}});}
}

当任务量达到一定程度,一个线程忙不过来时,就会发现其他线程也来帮忙辽~



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

相关文章

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文…

前端开发IDE WebStorm使用

一、安装WebStorm 前往官网下载WebStorm: The Smartest JavaScript IDE, by JetBrains 二、无限试用期工具 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;ide0 直接将压缩包拖入IDE窗口&#xff0c;将会自动刷新一次试用期时间。 也可以手动刷新&#xf…

Web前端:面向Web开发人员的顶级JavaScript开发工具和IDE

​  JavaScript是最流行的编程语言并且受到所有浏览器的支持&#xff0c;增强了用户与网页的交互。也就是说&#xff0c;许多JavaScript IDEs现在提供智能课程完成和实时消除错误。 这些有效的工具带有精确的语法检查器和显式调试器&#xff0c;用于快速创建各种JavaScript应…

前端开发者最常用的六款IDE

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

5款超好用的在线IDE,媲美vscode,可以直接编写前端构建化项目,而无需在本地下载依赖包,非常适合学习、demo、原型开发

以下5款在线IDE&#xff0c;可以直接编写前端构建化项目&#xff0c;而无需在本地下载依赖包&#xff0c;非常适合学习&#xff0c;写demo&#xff1a; 1、https://codesandbox.io/ 【推荐】 个人免费&#xff0c;支持公开项目个性化的设置&#xff0c;跨平台使用&#xff0c;…