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

article/2025/11/8 2:13:23

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

      • 方式一:继承于Thread类
      • 方式二:实现Runnable接口
      • 方式三:实现Callable接口
      • 方式四:使用线程池
      • 方式五:使用匿名类

方式一:继承于Thread类

步骤:
1.创建一个继承于Thread类的子类
2.重写Thread类的run() --> 将此线程执行的操作声明在run()中
3.创建Thread类的子类的对象
4.通过此对象调用start()执行线程

示例代码(遍历100以内的所有的偶数):

package atguigu.java;//1.创建一个继承于Thread类的子类
class MyThread extends Thread {//2.重写Thread类的run()@Overridepublic void run() {for (int i = 0; i < 100; i++) {if (i % 2 == 0) {System.out.println(Thread.currentThread().getName() + ":" + i);}}}
}public class ThreadTest {public static void main(String[] args) {//3.创建Thread类的子类的对象MyThread t1 = new MyThread();//4.通过此对象调用start():①启动当前线程 ② 调用当前线程的run()t1.start();/*问题一:我们不能通过直接调用run()的方式启动线程,这种方式只是简单调用方法,并未新开线程*///t1.run();/*问题二:再启动一个线程,遍历100以内的偶数。不可以还让已经start()的线程去执行。会报IllegalThreadStateException*///t1.start();//重新创建一个线程的对象MyThread t2 = new MyThread();t2.start();//如下操作仍然是在main线程中执行的。for (int i = 0; i < 100; i++) {if (i % 2 == 0) {System.out.println(Thread.currentThread().getName() + ":" + i + "***********main()************");}}}
}

输出结果(部分):
在这里插入图片描述

方式二:实现Runnable接口

步骤:
1.创建一个实现了Runnable接口的类
2.实现类去实现Runnable中的抽象方法:run()
3.创建实现类的对象
4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
5.通过Thread类的对象调用start()
① 启动线程
②调用当前线程的run()–>调用了Runnable类型的target的run()

示例代码(遍历100以内的所有的偶数):

package atguigu.java;//1.创建一个实现了Runnable接口的类
class MThread implements Runnable {//2.实现类去实现Runnable中的抽象方法:run()@Overridepublic void run() {for (int i = 0; i < 100; i++) {if (i % 2 == 0) {System.out.println(Thread.currentThread().getName() + ":" + i);}}}
}public class ThreadTest1 {public static void main(String[] args) {//3.创建实现类的对象MThread mThread = new MThread();//4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象Thread t1 = new Thread(mThread);t1.setName("线程1");//5.通过Thread类的对象调用start():① 启动线程 ②调用当前线程的run()-->调用了Runnable类型的target的run()t1.start();//再启动一个线程,遍历100以内的偶数Thread t2 = new Thread(mThread);t2.setName("线程2");t2.start();}}

输出结果(部分):
在这里插入图片描述

方式一和方式二的比较:

  • 开发中优先选择实现Runnable接口的方式
  • 原因:
    (1)实现的方式没有类的单继承性的局限性
    (2)实现的方式更适合来处理多个线程有共享数据的情况
  • 相同点:两种方式都需要重写run(),将线程要执行的逻辑声明在run()中

方式三:实现Callable接口

步骤:
1.创建一个实现Callable的实现类
2.实现call方法,将此线程需要执行的操作声明在call()中
3.创建Callable接口实现类的对象
4.将此Callable接口实现类的对象作为传递到FutureTask构造器中,创建FutureTask的对象
5.将FutureTask的对象作为参数传递到Thread类的构造器中,创建Thread对象,并调用start()
6.获取Callable中call方法的返回值

实现Callable接口的方式创建线程的强大之处

  • call()可以有返回值的
  • call()可以抛出异常,被外面的操作捕获,获取异常的信息
  • Callable是支持泛型的

示例代码1:

package com.atguigu.java2;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;//1.创建一个实现Callable的实现类
class NumThread implements Callable {//2.实现call方法,将此线程需要执行的操作声明在call()中@Overridepublic Object call() throws Exception {int sum = 0;//把100以内的偶数相加for (int i = 1; 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 futureTask = new FutureTask(numThread);//5.将FutureTask的对象作为参数传递到Thread类的构造器中,创建Thread对象,并调用start()new Thread(futureTask).start();try {//6.获取Callable中call方法的返回值//get()返回值即为FutureTask构造器参数Callable实现类重写的call()的返回值。Object sum = futureTask.get();System.out.println("总和为:" + sum);} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}}

输出结果(尾部):
在这里插入图片描述
示例代码2:

package com.jian8.juc.thread;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;class MyThread implements Callable<Integer> {@Overridepublic Integer call() throws Exception {System.out.println("Callable come in");try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}return 1024;}
}public class CallableDemo {public static void main(String[] args) throws ExecutionException, InterruptedException {//使用构造方法:FutureTask(Callable<V> callable)FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyThread());new Thread(futureTask, "AAA").start();//new Thread(futureTask, "BBB").start();//复用,直接取值,不要重启两个线程//PS:多个线程来抢一个futureTask,里面的计算方法call()只计算一次,要想多次算,要创建多个FutureTask<V>对象int a = 100;int b = 0;//b = futureTask.get();//要求获得Callable线程的计算结果,如果没有计算完成就要去强求,会导致堵塞,直到计算完成while (!futureTask.isDone()) {//当futureTask完成后取值b = futureTask.get();}System.out.println("Result=" + (a + b));}
}

运行结果:
在这里插入图片描述

方式四:使用线程池

线程池好处:
1.提高响应速度(减少了创建新线程的时间)
2.降低资源消耗(重复利用线程池中线程,不需要每次都创建)
3.便于线程管理

核心参数:

  • corePoolSize:核心池的大小
  • maximumPoolSize:最大线程数
  • keepAliveTime:线程没有任务时最多保持多长时间后会终止

步骤:
1.以方式二或方式三创建好实现了Runnable接口的类或实现Callable的实现类
2.实现run或call方法
3.创建线程池
4.调用线程池的execute方法执行某个线程,参数是之前实现Runnable或Callable接口的对象

示例代码:

package com.atguigu.java2;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;class NumberThread implements Runnable {@Overridepublic void run() {//遍历100以内的偶数for (int i = 0; i <= 100; i++) {if (i % 2 == 0) {System.out.println(Thread.currentThread().getName() + ": " + i);}}}
}class NumberThread1 implements Runnable {@Overridepublic void run() {//遍历100以内的奇数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 service = Executors.newFixedThreadPool(10);//输出class java.util.concurrent.ThreadPoolExecutorSystem.out.println(service.getClass());ThreadPoolExecutor service1 = (ThreadPoolExecutor) service;//自定义线程池的属性
//        service1.setCorePoolSize(15);
//        service1.setKeepAliveTime();//2. 执行指定的线程的操作。需要提供实现Runnable接口或Callable接口实现类的对象service.execute(new NumberThread());//适用于Runnableservice.execute(new NumberThread1());//适用于Runnable
//        service.submit(Callable callable);//适合使用于Callable//3. 关闭连接池service.shutdown();}}

输出结果(部分):
在这里插入图片描述

方式五:使用匿名类

Thread thread = new Thread(new Runnable() {@Overridepublic void run() {// 线程需要执行的任务代码System.out.println("子线程开始启动....");for (int i = 0; i < 30; i++) {System.out.println("run i:" + i);}}
});
thread.start();

或者

new Thread(() -> {System.out.println(Thread.currentThread().getName() + "\t上完自习,离开教室");
}, "MyThread").start();

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

相关文章

前端开发与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;…

工欲善其事,必先利其器——Web开发的10大IDE

工欲善其事&#xff0c;必先利其器——Web开发的10大IDE 一、Visual Studio Code二、PhpStorm三、Atom四、Pycharm五、NetBeans六、WebStorm七、Sublime Text八、Brackets九、IntelliJ IDEA十、HBuilderX 集成开发环境 (IDE) 是编码时极其重要的工具。在当今的市场上&#xff0…