Java SE(十二)之多线程

news2024/9/21 11:11:16

文章目录

  • 概述
    • 1.进程&线程
    • 2.并行&并发
  • 线程创建方式
    • 1.第一种:继承Thread类
    • 2.第二种:实现Runnable接口
    • 3.Callable、FutureTask接口
    • 4.线程创建的三种方式对比
  • Thread常用方法
    • 1.构造器
    • 2.设置和获取线程名称
    • 3.线程调度
    • 4.线程控制
    • 5.线程生命周期
  • 线程安全
    • 1.线程安全问题出现的原因?
    • 2.解决方案——线程同步
      • (1)同步代码块
      • (2)同步方法

概述

1.进程&线程

进程:是正在运行的程序
是系统进行资源分配和调用的独立单位,每一个进程都有它自己的内存空间和系统资源

线程:是进程中的单个顺序控制流,是一条执行路径

  • 单线程:一个进程如果只有一条执行路径,则称为单线程程序
  • 多线程:一个进程如果有多条执行路径,则称为多线程程序

2.并行&并发

并行:在同一时刻,有多个指令在多个CPU上同时执行
(一边吃面包一边写字)

并发:在同一时间间隔,有多个指令在单个CPU上交替执行
(在8.00-8.30时间段内,先吃面包再写字)

线程创建方式

1.第一种:继承Thread类

步骤
(1)定义一个子类(MyThread)继承线程类java.lang.Thread,重写run()方法

(2)创建这个类(MyThread)的对象

(3)调用线程对象的 start( ) 方法启动线程(启动后还是执行run方法的)

注意:
Q1:为什么要重写run()方法?
因为run()是用来封装被线程执行的代码

Q2:为什么不直接调用了run方法,而是调用start启动线程 ?
直接调用run方法会当成普通方法执行,此时相当于还是单线程执行。只有调用start方法才是启动一个新的线程执行。

e.g
写法1完整版

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

        for (int i = 0; i < 5; i++) {
            System.out.println("主线程执行输出:" + i);
        }
    }
}

写法二匿名内部类
上述写法比较复杂,可以直接简化:

new Thread()
        {
            @Override
            public void run()
            {
                for(int i=0;i<50;i++) {
                    System.out.println(getName() + ":" + i);
                }
            }
        }.start();

2.第二种:实现Runnable接口

步骤:
(1)定义一个线程任务类MyRunnable类实现Runnable接口,重写run()方法

(2)创建MyRunnable任务对象

(3)创建Thread类的对象,把MyRunnable对象作为构造方法的参数(即把MyRunnable任务对象交给Thread处理)

(4)调用线程对象的start()方法启动线程

e.g.
写法一完整版:

public class ThreadDemo2 {
/**
   1、定义一个线程任务类 实现Runnable接口
 */
class MyRunnable  implements Runnable {
    /**
       2、重写run方法,定义线程的执行任务的
     */
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("子线程执行输出:" + i);
        }
    }
    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);
        }
    }
}

写法二匿名内部类:

new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                System.out.println("实现runnable接口");
            }
        }).start();
        
// 或者直接lambda表达式
new Thread(() -> System.out.println("实现runnable接口")).start();

3.Callable、FutureTask接口

jdk5新增的创建方式

4.线程创建的三种方式对比

在这里插入图片描述

相比直接继承Thread类,实现Runnable接口有如下好处:

  • 避免Java单继承限制,但是通过实现Runnable接口,可以在同一个类中实现多个接口。这使得线程类能够继续扩展其他类的功能,而不仅限于Thread类。

  • 提高代码的重用性:通过实现Runnable接口,线程类可以将线程的执行逻辑与线程的管理逻辑分离。

  • 分离线程与任务:通过实现Runnable接口,线程类只负责线程的管理,而不关注具体的任务逻辑。

Thread常用方法

1.构造器

在这里插入图片描述

2.设置和获取线程名称

方法含义
String setName(String name)将此线程的名称更改为等于参数name
String getName( )返回此线程的名称
static Thread currentThread( )返回对当前正在执行的线程对象的引用

3.线程调度

在这里插入图片描述

4.线程控制

方法含义
static void sleep(long millis)使当前正在执行的线程停留(暂停执行)指定的毫秒数
void join()等待这个线程死亡
void setDaemon(booleanon)将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出

5.线程生命周期

在这里插入图片描述

线程安全

1.线程安全问题出现的原因?

(1)存在多线程并发

(2)同时访问共享资源

(3)存在修改共享资源

2.解决方案——线程同步

加锁:加锁,把共享资源进行上锁,每次只能一个线程进入访问完毕以后解锁,然后其他线程才能进来。

加锁方式:

(1)同步代码块

(2)同步方法

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

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

相关文章

静态路由和默认路由的工作原理

目录 静态路由 静态路由配置 默认&#xff08;缺省&#xff09;路由 路由的高级特性 1&#xff0c;递归路由 2&#xff0c;等价路由 3&#xff0c;浮动路由 4&#xff0c;路由汇总 环路问题&#xff1a; 解决方法&#xff1a; 静态路由 在路由器手动添加路由条目 静…

基于深度学习的高精度浣熊检测识别系统(PyTorch+Pyside6+模型)

摘要&#xff1a;基于深度学习的高精度浣熊检测&#xff08;水牛、犀牛、斑马和大象&#xff09;识别系统可用于日常生活中或野外来检测与定位浣熊目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的浣熊目标检测识别&#xff0c;另外支持结果可视化与图片或视…

Spring Boot 集成支付宝、微信等支付平台API

Spring Boot 集成支付宝、微信等支付平台API 在现代的 Web 应用程序开发中&#xff0c;与第三方 API 的集成是非常常见的需求。例如&#xff0c;支付宝、微信等支付平台的支付接口、短信验证码的发送接口、邮件发送接口等。Spring Boot 提供了许多便捷的方式来集成这些第三方 …

Python实战基础17-包

1、pip的安装配置 1.1 pip命令的使用 在安装python时&#xff0c;同时还会安装pip软件&#xff0c;它是python的包管理工具&#xff0c;可以用来查找、下载、安装和卸载python的第三方资源包。 1.2 配置pip 可以直接在终端输入pip命令&#xff0c;如果出错可能会有两个原因…

接口自动化测试实战:JMeter+Ant+Jenkins+钉钉机器人群通知完美结合

目录 前言 一、本地JAVA环境安装配置&#xff0c;安装JAVA8和JAVA17 二、安装和配置Jmeter 三、安装和配置ant 四、jmeter ant配置 五、jenkins安装和配置持续构建项目 文末福利 前言 搭建jmeterantjenkins环境有些前提条件&#xff0c;那就是要先配置好java环境&#…

OS-内存管理-4种内存管理方式(连续分配,页式,段式,段页)。

一&#xff0c;内存管理四种方式。 二&#xff0c;连续分配管理方式。 连续分配方式&#xff1a;为用户分配连续的内存空间。 1.单一连续分配方式 2.固定分区分配方式 3.动态分区分配方式 4.三种连续分配方式的对比。 三&#xff0c;基于页式存储管理。 1.页式 为进一步提高…

【来不及刷题之】32、二分搜索(寻找数,寻找左右边界)

1. 基础二分搜索&#xff1a;寻找一个数 一道很基础的题目&#xff0c;主要注意一下循环条件是 left<right 即可 class Solution {public int search(int[] nums, int target) {int left0;int rightnums.length-1;while(left<right){int midleft(right-left)/2;if(nums…

第二十一章行为性模式—访问者模式

文章目录 访问者模式解决的问题结构实例存在的问题使用场景 拓展动态分派静态分派双分派 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。行为型模…

华为OD机试真题B卷 Java 实现【箱子之形摆放】,附详细解题思路

一、题目描述 要求将一批箱子按从上到下以‘之’字形的顺序摆放在宽度为 n 的空地上&#xff0c;输出箱子的摆放位置&#xff0c;例如&#xff1a;箱子ABCDEFG&#xff0c;空地宽为3。 摆放效果如下图&#xff1a; 则输出结果为&#xff1a; AFG BE CD 二、输入描述 一行…

智能语音交互流程

引言 用该文来讲解语音全流程涉及到的技术&#xff0c;整体语音涉及的交互流程如下图&#xff1a; Part1 唤醒 语音唤醒指的是通过预设的关键词即可将智能硬件从休眠状态唤醒&#xff0c;来执行相应操作。 1.1 交互模式 传统模式 唤醒方式&#xff1a;先唤醒设备&#xff…

重学数据结构与算法

学习数据结构与算法的目的&#xff1a; 优化时间复杂度与空间复杂度 优化时间复杂度与空间复杂度 优化时间复杂度与空间复杂度 教程总纲&#xff1a; 暴力解法(模拟)、算法优化(递归/二分/排序/DP)、时刻转换(数据结构) 1.时间复杂度的核心方法论2.增删查——选取数据结构的基…

MySQL_9 事务机制与隔离机制

目录 一、事务概述 1.定义 : 2.事务和锁 : 二、事务操作 1.MySQL控制台事务的基本操作 : 2.代码演示 : 3.注意事项 : 三、事务的“ACID”特性 : 四、隔离机制 1.介绍 : 2.分类 : 3.常用指令 : 一、事务概述 1.定义 : 事务用于保证数据的一致性&#xff0c;它由一…

python批量实现pdf转换为图片|实现pdf转为jpg/png|实现word批量转pdf|python批量实现word转换为图片

本文介绍了一种使用 Python 脚本来完成这项工作的方法&#xff0c;该脚本基于 PyMuPDF、pdf2image 和 win32com 库实现&#xff0c;可以帮助您快速地将 Word 文档转换为 PDF 文件&#xff0c;并将 PDF 文件转换为 PNG 图片。 一、安装所需的库和软件 在开始使用该脚本之前&am…

AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(一):概述

AWTK=Toolkit AnyWhere,一款国产免费开源工具,ZLG开发的开源GUI引擎,为嵌入式等系统提供图形界面开发IDE。 随着汽车技术的发展,汽车仪表盘也在快速发展,从最初的机械式到电气式,再到数字化。这次电动化、智能化又一次让汽车仪表出现了飞跃式的发展,再未来,仪表板上可…

04SpringCloud 消息中间件

为什么要使用消息中间件 同步通信&#xff1a;耗时长&#xff0c;受网络波动影响&#xff0c;不能保证高成功率&#xff0c;耦合性高。 同步&#xff0c;异步 并发&#xff1a;一段时间&#xff08;1S&#xff09;多个请求数 并行&#xff1a;时间节点&#xff0c;多个指令…

干接点与湿接点

&#xff08;1&#xff09;干接点的定义 无源开关&#xff1b;具有闭合和断开的2种状态&#xff1b;2个接点之间没有极性&#xff0c;可以互换。 常见的干接点信号有&#xff1a; 1&#xff09;各种开关如&#xff1a;限位开关、行程开关、脚踏开关、旋转开关、温度开关、液…

超越象限:解密 α 碎片的归属问题

文章目录 参考环境α 碎片的归属问题问题概述终边相同角圆心角终边相同角 象限角 描述象限角第一象限角任意象限角 特殊方案问解 叠加坐标系上部下部叠加坐标系 一般方案问解任意角 α分析绘图要领叠加坐标系N-N 参考 项目描述搜索引擎Google 、Bing百度百科首页佟大大还是ETT…

苹果iPhone14如何批量删除联系人?iPhone 14批量删除联系人方法

苹果iPhone 14如何批量删除联系人&#xff1f;手动一个个删实在太麻烦了&#xff01; 苹果iPhone 14手机的通讯录本身不支持批量删除联系人&#xff0c;但是如果通讯录在iCloud中开启过备份&#xff0c;就可以对联系人进行批量操作。 需要注意的是&#xff0c;iPhone 14手机端…

聊聊开源的类ChatGPT工作——ChatGLM

这是”聊聊开源的类ChatGPT工作“的第二篇&#xff0c;写第一篇[7]的时候&#xff0c;当时恰巧MOSS开源&#xff0c;就顺手写了MOSS。但要问目前中文领域的“开源”的语言模型谁更强&#xff0c;公认的还是ChatGLM-6B&#xff08;以下简称ChatGLM&#xff09;。 下面是官方对C…

【20230531】Git命令和Github相关使用

1 在Git中缓存GitHub凭据 根据系统下载对应的GitHub CLI 2.25.1 2. github主页&#xff0c;点击用户头像选择settings->Developer Settings->Personal access tokens申请密钥&#xff08;主要分为Fine-grained tokens和Tokens classic&#xff09;gh需要使用的是Tokens …