多线程学习记录

进程是一个个应用程序,线程则可以理解为一个应用进程中的多个功能。有了多线程,便可以让程序同时去做多件事情。

并发:在同一时刻,有多个指令在单个CPU上交替执行
并行:在同一时刻,有多个指令在多个CPU上同时执行

多线程实现

在Java中,实现多线程的方法有三种,分别是继承Tread类,重写run方法,第二种便是实现Runnable接口,重写run方法,最后一种便是实现Callable接口。

继承Tread类

public class MyThread extends Thread{
    @Override
    public void run() {
        for(int i=0;i<100;i++){
            System.out.println(getName()+"hello world");
        }
    }
}

将其调用实现:

public class Test {
    public static void main(String[] args) {
        Thread t1=new MyThread();
        Thread t2=new MyThread();
        t1.setName("线程1");
        t2.setName("线程2");
        t1.start();
        t2.start();
    }
}

当然,如果我们没有给线程设置名字,线程也是有默认的名字的,即Thread-序号,序号由0开始

实现Runnable接口

public class MyRunnable implements Runnable{
    @Override
    public void run() {
        for(int i=0;i<100;i++){
            Thread t=Thread.currentThread();
            System.out.println(t.getName()+"hello world");
        }
    }
}

调用该接口实现

public class Test {
    public static void main(String[] args) {
        //定义多线程要执行的任务
        MyRunnable mr=new MyRunnable();
        //创建线程对象
        Thread t1=new Thread(mr);
        Thread t2=new Thread(mr);
        t1.setName("线程1");
        t2.setName("线程2");
        t1.start();
        t2.start();
    }
}

实现Callable接口

通过Callable接口与Future接口进行实现
这种实现方式的编程相对复杂,但从上面的实现过程中我们发现上述实现都是没有返回值的,那如果我们想要获得多线程的运行结果该怎么办呢?那就可以通过这个方式实现了。

import java.util.concurrent.Callable;
public class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        int sum=0;
        for(int i=0;i<=100;i++){
            sum+=i;
            //System.out.println(sum);
        }
        return sum;
    }
}

调用:

 		//创建Callable对象,表示多线程要执行的任务
        MyCallable mc=new MyCallable();
        //原本应该使用Future来管理多线程结果的,但由于Future是个接口,因此我们使用其实现类FutureTask
        FutureTask<Integer> futureTask=new FutureTask<>(mc);
        //创建Thread并启动
        Thread t1=new Thread(futureTask);
        t1.setName("线程1");
        t1.start();
        Integer r1=futureTask.get();
        System.out.println(r1);

在这里插入图片描述

Thread中常见的四个成员方法

在这里插入图片描述

setName

设置线程名,需要注意的是,即使我们不给其指定线程名称,他也会有一个默认的线程名。

getName

获取线程名

currentThread()

该方法可以获取当前运行线程的对象。此外,JVM虚拟机启动后,会加载多条线程,其中一条线程便是main线程,即定义在我们的main方法中。如当前我们现在就是在main线中执行的代码。

public static void main(String[] args) throws ExecutionException, InterruptedException {
        Thread t1=new MyThread();
        Thread t2=new MyThread();
        t1.setName("线程1");
        System.out.println(Thread.currentThread());
        t2.setName("线程2");
        t1.start();
        System.out.println(t1.currentThread());
        t2.start();

在这里插入图片描述

线程休眠

调用线程的sleep方法,休眠单位毫秒,1秒=1000毫秒

package Thread;
public class MyThread extends Thread{
    @Override
    public void run() {
        for(int i=0;i<100;i++){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(getName()+"hello world");
        }
    }
}

在这里插入图片描述

线程的优先级

线程调度方式有两种,分别是抢占式调度和非抢占式调度。
在Java中,采用的是抢占式调度的方式,这就意味着随机

在这里插入图片描述

Java中优先级共分为10档,最低为1,最高为10,在不设定的情况下,默认为5。

		Thread t1=new MyThread();
        Thread t2=new MyThread();
        t1.setName("线程1");
        t2.setName("线程2");
        t1.setPriority(1);
        t2.setPriority(10);
        t1.start();
        System.out.println(Thread.currentThread().getPriority());
        t2.start();

可以看到,由于线程2的优先级较高,因此在前面大多都是线程2在执行,当前的线程是main线程,他的优先级也是5

在这里插入图片描述

线程类型

守护线程

守护线程,又称备胎线程,当其他的非守护线程结束后,守护线程也会相继结束。
我们定义两个不同的线程,分别是非守护线程与守护线程,该线程为非守护线程,执行10次。

public class MyTread1 extends Thread{
        @Override
        public void run() {
            for(int i=0;i<10;i++){
                System.out.println(getName()+" "+i);
            }
        }
    }

该线程为守护线程,执行100次循环

package Thread.Daemon;

public class MyTread2 extends Thread{
    @Override
    public void run() {
        for(int i=0;i<100;i++){
            System.out.println(getName()+" "+i);
        }
    }
}

我们将后者设置为守护线程,使用setDaemon方法即可。

package Thread.Daemon;

public class Test {
    public static void main(String[] args) {
        MyTread1 t1=new MyTread1();
        MyTread2 t2=new MyTread2();
        t2.setDaemon(true);
        t1.start();
        t2.start();
    }
}

随后我们可以看到运行结果,由于非守护线程只运行10次循环,那么根据线程的随机性我们可知非守护线程必定会先执行完毕,此时,守护线程也会陆续停止,这段时间是非守护线程通知守护线程自己已经执行完。

在这里插入图片描述
此外,需要注意的是,尽管将线程2设置为守护线程,但其优先级仍默认为5。

那么守护线程有什么业务场景呢,比如说聊天与传输文件:

在这里插入图片描述

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

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

相关文章

K8s: 关于Kubernetes中的Pod的创建,实现原理,Job调度pod以及pod网络

Pod 概述 Pod 是最小部署的单元&#xff0c;Pod里面是由一个或多个容器组成&#xff0c;也就是一组容器的集合一个pod中的容器是共享网络命名空间&#xff0c;每个Pod包含一个或多个紧密相关的用户业务容器Pod 是 k8s 系统中可以创建和管理的最小单元是资源对象模型中由用户创…

winform入门篇 第14章 列表控件

列表控件 列表控件 ListView相当于 ListBox的增强版&#xff0c;支持多列显示 最典型的例子:Windows的文件管理器的列表显示 列表控件的几种视图: Detail:详情模式 List: 列表模式 LargeIcon:大图标模式 Smallcon:小图标模式 列表控件的几个特点: 显示模式可以切换 可以…

java高校办公室行政事务管理系统设计与实现(springboot+mysql源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的闲一品交易平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于mvc的高校办公室行政…

excel导出并合并

普通导出数据 需求 需要将相同列数据合并 效果图&#xff1a; 代码&#xff1a; package cn.silence.test;import lombok.AllArgsConstructor; import lombok.Data;/*** 班级信息*/ Data AllArgsConstructor public class ClassInfo {/*** 学院*/private String academy;/**…

OpenHarmony多媒体-ijkplayer

简介 ijkplayer是OpenHarmony环境下可用的一款基于FFmpeg的视频播放器。 演示 编译运行 1、通过IDE工具下载依赖SDK&#xff0c;Tools->SDK Manager->OpenHarmony SDK 把native选项勾上下载&#xff0c;API版本>9 2、开发板选择RK3568&#xff0c;ROM下载地址. 选择…

直流无刷散热风扇的知识原理与内部构成

①直流无刷风扇的结构&#xff1a;主要可分为转子、定子、外框、电机(马达)这四个主要部分以及一些其它的零碎的部件 第一&#xff0c;风扇转子部分: 包括风扇扇叶&#xff0c;是产生空气流动的核心、散热风扇的轴心&#xff0c;用来支撑平衡扇叶滚动、转子磁环&#xff0c;永…

Python路面车道线识别偏离预警

程序示例精选 Python路面车道线识别偏离预警 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《Python路面车道线识别偏离预警》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易…

Spring Boot + 事务钩子函数,打造高效支付系统!

今天&#xff0c;我继续安利一个独门绝技&#xff1a;Spring 事务的钩子函数。 单纯的讲技术可能比较枯燥乏味。 接下来&#xff0c;我将以一个实际的案例来描述Spring事务钩子函数的正确使用姿势。 一、案例背景 拿支付系统相关的业务来举例。在支付系统中&#xff0c;我们…

Nodejs 第六十四章(SSO单点登录)

单点登录 单点登录&#xff08;Single Sign-On&#xff0c;简称SSO&#xff09;是一种身份认证和访问控制的机制&#xff0c;允许用户使用一组凭据&#xff08;如用户名和密码&#xff09;登录到多个应用程序或系统&#xff0c;而无需为每个应用程序单独提供凭据 SSO的主要优…

openGauss学习笔记-266 openGauss性能调优-TPCC性能调优测试指导-文件系统配置

文章目录 openGauss学习笔记-266 openGauss性能调优-TPCC性能调优测试指导-文件系统配置266.1 查看当前数据盘的文件系统类型266.2 对于需要修改的磁盘&#xff0c;备份所需的数据至其他磁盘或其他服务器266.3 格式化磁盘为xfs文件系统266.4 执行**步骤一** openGauss学习笔记-…

【Keil MDK5新建工程】STM32F103C8T6

一、参数及片上外设 二、系统结构及引脚定义 三、工程架构及新建工程步骤 四、GPIO模式 一、参数及片上外设 二、系统结构及引脚定义 三、工程架构及新建工程步骤 建立工程文件夹&#xff0c;Keil中新建工程&#xff0c;选择型号 工程文件夹里建立Core、Library、User等文件夹…

2024年华中杯数学建模竞赛ABC题思路分析

简单分析一下各个题目可能需要用到的方法和模型&#xff0c;完整代码和成品论文见文末 A题 太阳能路灯光伏板的朝向设计问题: 1. 球面几何、天文学相关知识,如赤纬角、太阳高度角、时角等概念和公式 2. 太阳辐射模型,根据太阳能辐射强度、大气衰减系数等计算地表太阳辐射强度…

绝对隔离+底层限制,成就猎鹰蜜罐“牢不可破”的立体化安全

前言 自网络诞生以来&#xff0c;攻击威胁事件层出不穷&#xff0c;网络攻防对抗已成为信息时代背景下的无硝烟战争。然而&#xff0c;传统的网络防御技术如防火墙、入侵检测技术等都是一种敌暗我明的被动防御&#xff0c;难以有效应对攻击者随时随地发起的无处不在的攻击和威胁…

【学习笔记】Vue3源码解析:第五部分 - 实现渲染(1)

课程地址&#xff1a;【已完结】全网最详细Vue3源码解析&#xff01;&#xff08;一行行带你手写Vue3源码&#xff09; 第五部分-&#xff1a;&#xff08;对应课程的第29-32节&#xff09; 第29节&#xff1a;《实现渲染的createRender方法》 1、通过createApp()方法得到一个…

AI热潮下,公链基础设施赛道都有哪些变化?

最近在一级市场&#xff0c;最火热的赛道无疑是AI&#xff0c;其次是BTC&#xff0c;每天聊的项目80%都集中在这两个赛道&#xff0c;我个人最多的时候一天可以聊5&#xff0c;6个AI项目。 可以预见的是AI泡沫会在明后年达到顶峰&#xff0c;随着数以百计的AI新项目上线&#…

QT实现客户端断开连接

Widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), socket(new QTcpSocket(this)) {ui->setupUi(this);//初始化界面ui->msgEdit->setEnabled(false); //不可用ui-…

SQL Server Management Studio 显示行号

前言 在使用 SQL Server Management Studio (SSMS) 进行数据库管理和查询时&#xff0c;能够看到代码的行号是非常有用的。这可以帮助您更容易地定位代码错误、讨论特定的代码行&#xff0c;或者在执行长查询时快速找到特定行。在本文中&#xff0c;我将向您展示如何在 SSMS 中…

AIDE:自动驾驶目标检测的自动数据引擎

AIDE&#xff1a;自动驾驶目标检测的自动数据引擎 摘要IntroductionRelated WorksMethodData FeederModel Updater4 Experiments 摘要 自动驾驶车辆&#xff08;AV&#xff09;系统依赖于健壮的感知模型作为安全保证的基石。然而&#xff0c;道路上遇到的物体表现出长尾分布&a…

图像生成模型浅析(Stable Diffusion、DALL-E、Imagen)

目录 前言1. 速览图像生成模型1.1 VAE1.2 Flow-based Model1.3 Diffusion Model1.4 GAN1.5 对比速览 2. Diffusion Model3. Stable Diffusion3.1 Text Encoder3.2 Decoder3.3 Generation Model 总结参考 前言 简单学习下图像生成模型的相关知识&#x1f917; 以下内容来自于李宏…

vue3+elment复杂详情页面打开后,再打开其他页面都显示空白,控制台也没什么特殊报错

页面使用了el-tabs 、 el-tab-pane、el-table 等标签 但是经测试不是这些问题导致的 js也使用了onMounted &#xff0c;但是除掉也时空白页面 反正之前人写的页面可乱&#xff0c;尤其是js这块&#xff0c;穿插引用import一大堆 主题页面样式布局如下 最后看到页面代码太乱…