Java基础——多线程创建

news/2024/3/29 21:55:44/文章来源:https://blog.csdn.net/weixin_61275790/article/details/130308308

(1)什么是线程?

  • 线程(thread)是一个程序内部的一条执行路径。
  • 程序中只有一条执行路径,那么这个程序就是单线程的程序。

 (2)多线程是什么?

  • 多线程是指从软硬件上实现多执行流程的技术。

(3)多线程的创建

3.1.继承Thread类

  • 继承Thread类(定义一个子类继承线程类java.lang.Thread)
  • 重写run方法
  • 创建线程对象
  • 调用start()方法启动

注意:

1.为什么不直接调用run方法,而是调用start启动线程

  • 直接调用run方法会当成普通方法执行,此时相当于还是单线程执行。
  • 只有调用start方法才是启动一个新的线程执行。 

2.不要把主线程放在子线程之前,因为主线程先跑,相当于一个单线程的效果。

3.虽然代码简单,但是存在单继承的局限性,线程类继承Thread后,不能继承其他类,不便于扩展。

/**目标:多线程的创建方式一:继承Thread类实现。*/
public class ThreadDemo1 {public static void main(String[] args) {// 3、new一个新线程对象Thread t = new MyThread();// 4、调用start方法启动线程(执行的还是run方法)t.start();for (int i = 0; i < 5; i++) {System.out.println("主线程执行输出:" + i);}}
}/**1、定义一个线程类继承Thread类*/
class MyThread extends Thread{/**2、重写run方法,里面是定义线程以后要干啥*/@Overridepublic void run() {for (int i = 0; i < 5; i++) {System.out.println("子线程执行输出:" + i);}}
}

3.2.实现Runnable接口

  • 定义一个线程任务类MyRunnable实现Runnable接口,重写run()方法。
  • 创建MyRunnable任务类。
  • 把MyRunnable任务对象交给Thread处理。
  • 调用线程对象的start()方法启动线程。
  • Thread的构造器:

优点:线程任务类只是实现接口,可以继续继承类和实现接口,扩展性强。

缺点:编程多一层对象包装,如果线程有执行结果是不可以直接返回的。

/**目标:学会线程的创建方式二,理解它的优缺点。*/
public class ThreadDemo2 {public static void main(String[] args) {// 3、创建一个任务对象Runnable target = new MyRunnable();// 4、把任务对象交给Thread处理Thread t = new Thread(target);// Thread t = new Thread(target, "1号");// 5、启动线程t.start();for (int i = 0; i < 10; i++) {System.out.println("主线程执行输出:" + i);}}
}/**1、定义一个线程任务类 实现Runnable接口*/
class MyRunnable  implements Runnable {/**2、重写run方法,定义线程的执行任务的*/@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println("子线程执行输出:" + i);}}
}

 (匿名内部类形式)

  • 可以创建Runnable的匿名内部类对象。
  • 交给Thread处理。
  • 调用线程对象的start()启动线程。
/**目标:学会线程的创建方式二(匿名内部类方式实现,语法形式)*/
public class ThreadDemo2Other {public static void main(String[] args) {Runnable target = new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println("子线程1执行输出:" + i);}}};Thread t = new Thread(target);t.start();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println("子线程2执行输出:" + i);}}}).start();new Thread(() -> {for (int i = 0; i < 10; i++) {System.out.println("子线程3执行输出:" + i);}}).start();for (int i = 0; i < 10; i++) {System.out.println("主线程执行输出:" + i);}}
}

3.3.利用Callable,FutureTask接口实现

1.得到任务对象

  • 定义类实现Callable接口,重写call方法,封装要做的事情。
  • 用FutureTask把Callable对象封装成线程任务对象。

2.把线程任务对象交给Thread处理。

3.调用Thread的start方法启动线程,执行任务。

4.线程执行完毕后,通过FutureTask的get方法去获取任务执行结果。

 

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
/**目标:学会线程的创建方式三:实现Callable接口,结合FutureTask完成。*/
public class ThreadDemo3 {public static void main(String[] args) {// 3、创建Callable任务对象Callable<String> call = new MyCallable(100);// 4、把Callable任务对象 交给 FutureTask 对象//  FutureTask对象的作用1: 是Runnable的对象(实现了Runnable接口),可以交给Thread了//  FutureTask对象的作用2: 可以在线程执行完毕之后通过调用其get方法得到线程执行完成的结果FutureTask<String> f1 = new FutureTask<>(call);// 5、交给线程处理Thread t1 = new Thread(f1);// 6、启动线程t1.start();Callable<String> call2 = new MyCallable(200);FutureTask<String> f2 = new FutureTask<>(call2);Thread t2 = new Thread(f2);t2.start();try {// 如果f1任务没有执行完毕,这里的代码会等待,直到线程1跑完才提取结果。String rs1 = f1.get();System.out.println("第一个结果:" + rs1);} catch (Exception e) {e.printStackTrace();}try {// 如果f2任务没有执行完毕,这里的代码会等待,直到线程2跑完才提取结果。String rs2 = f2.get();System.out.println("第二个结果:" + rs2);} catch (Exception e) {e.printStackTrace();}}
}/**1、定义一个任务类 实现Callable接口  应该申明线程任务执行完毕后的结果的数据类型*/
class MyCallable implements Callable<String>{private int n;public MyCallable(int n) {this.n = n;}/**2、重写call方法(任务方法)*/@Overridepublic String call() throws Exception {int sum = 0;for (int i = 1; i <= n ; i++) {sum += i;}return "子线程执行的结果是:" + sum;}
}

3.4.三种方式的比较:

 

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

让 ChatGPT 扮演一个艺术家,协助我们生成绘图 prompt

stable-diffusion Prompt 生成 直接生成 按照惯用的扮演思路&#xff0c;我们可以让 ChatGPT 扮演一个艺术家&#xff0c;协助我们生成绘图 prompt。考虑到 ChatGPT 和 DallE 同为 openai 公司产品&#xff0c;且 stable-diffusion 开源模型出现较晚&#xff0c;ChatGPT 训练…

【软件工程】UML序列图

一.概述 序列图&#xff08;时序图&#xff09;是一种软件工程行化建模方法&#xff0c;用于可视化系统或应用程序中多个对象之间 的交互。在序列图中&#xff0c;每个对象都表示为竖直线&#xff0c;对象之间的消息则表示为水平箭头 从一个对象指向另一个对象。 序列图可以…

搞懂 API ,地图 API 制作方法分享

地图 API 是一种基于 Web 开发的应用程序编程接口&#xff0c;可以用于创建和展示地图及地理信息。以下是一些地图 API 制作的方法&#xff1a; 选择地图 API 平台&#xff1a;目前市场上有很多地图 API 平台供选择&#xff0c;比如 Google Maps API、百度地图 API、高德地图 A…

2023年五月份图形化三级打卡试题

活动时间 从2023年5月1日至5月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; 小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 小朋友做完题目后&#xff0c;截图到朋友圈打卡并把打卡的截图发到活动群…

在阿里做测试开发的这5年,收获与感悟...

正好在离职交接空档期&#xff0c;就抽空简单分享自己的一些个人经历给大家&#xff0c;希望对刚毕业不久或者工作三五年的同学能有一些帮助。 测试新人 我的职业生涯开始和大多数测试人一样&#xff0c;开始接触都是纯功能界面测试。那时候在一家电商公司做测试&#xff0c;做…

基于异常值鲁棒性问题的极限学习机的回归问题研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

2023年五月份图形化四级打卡试题

活动时间 从2023年5月1日至5月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; 小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 小朋友做完题目后&#xff0c;截图到朋友圈打卡并把打卡的截图发到活动群…

【独具匠心设计】全网最好的国学,历代文学,名著,小说网推荐

极力推荐一个功能简单、易用、访问快捷、界面大气,清爽、资源丰富、设计专业、完全免费的文学网站。它的名字叫“历代文学”&#xff0c;是由成都心海科技公司所研发&#xff0c;设计真可谓独具匠心。 “历代文学”收录了来自古今中外 20 多个朝代&#xff0c;近 30个 国家的作…

消息队列选型

消息队列选型 大家好&#xff0c;我是易安&#xff01;今天我们聊下消息队列常见选型。 消息队列作用 谈选型之前我们先讲下我们为什么需要消息队列。 消息队列是一种很流行的技术&#xff0c;自从系统间开始通信时&#xff0c;消息队列就出现了。然而&#xff0c;对消息队列给…

Windows 远程桌面提示没有远程桌面授权服务器可以提供许可证

可参考之前发布的一篇文章&#xff0c;帮助你远程登录&#xff1a;远程连接提示 由于没有远程桌面授权服务器提供许可证_计算机没有远程桌面客户端访问许可证_csdn_aspnet的博客-CSDN博客 虽然上述文章命令可以远程进入系统&#xff0c;但是每次都需要使用上述文章中的命令进入…

【数据库】索引和事务

目录 1.索引 1.1关于索引 索引是什么&#xff1f; 为什么要有索引&#xff1f; 索引的作用&#xff1f; 索引的优点和缺点&#xff1f; 1.2索引类型及创建 索引的分类 创建索引 1.3索引的数据结构 1.4索引覆盖 2.事务 2.1关于事务 概念 事务的使用 2.2事务的特…

他们是怎么使用上gpt-4的-gpt-4在哪用

为什么有人在使用GPT4 openAI尚未正式发布GPT-4模型&#xff0c;也没有公布任何与GPT-4相关的信息。因此&#xff0c;没有人可以在使用GPT-4模型。 值得注意的是&#xff0c;虽然OpenAI尚未正式发布GPT-4&#xff0c;但由于其之前发布的GPT-3具有出色的性能和功能&#xff0c…

chmod 命令 (chmod 0660)

chmod的作用: 用于设置文件所有者和文件关联组的命令,就是控制用户的权限命令 注意事项: chown 需要超级用户 root 的权限才能执行此命令。 自己常用chmod 命令是 chmod 777 * 给所有文件权限 chmod 777 文件名 给单独文件权限 这个777 是怎么来的, 或者chmod 0660 这…

C++STL详解(10) -- 使用哈希表封装unordered_set和unordered_map

文章目录 哈希表模板参数改造针对模板参数V改造增加仿函数获取具体数据类型. 哈希表的正向迭代器正向迭代器中的内置成员:正向迭代器的成员函数 哈希表插入函数的修改(适用于unordered_map)一个类型K去做set和unordered_set他的模板参数的必备条件.unordered_set的模拟实现(完整…

PySide6/PyQT多线程的使用

前言 上一篇文章介绍了在PySide6中使用多线程去解决PySide6/PyQT的界面卡死问题&#xff0c;这次来具体介绍下多线程在使用上的一些细节。 本文尝试对以下两个问题进行解决&#xff1a; 对 PySide6/PyQT 多线程的使用不熟悉&#xff1b;在 PySide6/PyQT 的应用程序里有耗时任…

【Linux基础IO之 内存文件操作】

目录&#xff1a; 前言一、引入C语言中的文件操作系统文件操作open 位图权限close、write、readlseek C语言中的文件操作函数与系统文件操作函数的联系 三、文件描述符1.文件描述符是什么2.文件缓冲区再谈重定向 四、文件缓冲区分类语言级缓冲区为什么要有两个缓冲区 五、仿写c…

OpenGL入门教程之 变换

引言 这是一个闪耀的时刻&#xff0c;因为我们即将能生产出令人惊叹的3D效果&#xff01; 变换 向量和矩阵变换包括太多内容&#xff0c;但由于学过线性代数和GAMES101&#xff0c;因此不在此做过多阐述。仅阐述包括代码的GLM内容。 GLM的使用 &#xff08;1&#xff09;GLM…

8、接口的高级用法

1、索引类型 我们可以使用接口描述索引的类型和通过索引得到的值的类型&#xff0c;比如一个数组[‘a’, ‘b’]&#xff0c;数字索引0对应的通过索引得到的值为’a’。我们可以同时给索引和值都设置类型&#xff0c;看下面的示例&#xff1a; interface RoleDic {[id: number…

Pinia与Vuex区别、Pinia安装与使用

目录 一、Pinia和Vuex区别 二、Pinia使用state、getters、actions 1、安装使用Pinia 2、State 3、actions 4、getters 三、Pinia划分模块 1、目录结构 2、store/user.js 3、某组件使用 四、Pinia持久化存储 1、安装插件 2、store/index.js 3、store/user.js 4、…

收废品小程序开发中的常见问题及解决方法

常见问题 1. 用户界面设计 小程序的用户界面设计至关重要。设计师需要在用户界面中提供清晰的指示&#xff0c;以便用户可以轻松地找到他们需要的功能。同时&#xff0c;设计师还需要确保用户界面的整体风格与公司的品牌形象相符。 2. 功能开发 开发小程序的功能需要考虑到…