多线程-Thread类及常见方法

目录

1.什么是Thread类

1.1Thread 的常⻅构造⽅法

 1.2 Thread 的⼏个常⻅属性

 2.启动⼀个线程 - start()

经典面试题:start 和run 区别

3.中断⼀个线程

方法一:

 方法二:

4.等待⼀个线程 - join()

5. 获取当前线程引用

方法一:

 方法二:


1.什么是Thread类

       Thread类是Java编程语言中的一个重要类,用于支持多线程编程。它是java.lang包中的一部分,提供了创建和管理线程的方法和功能。通过使用Thread类,可以同时执行多个任务,实现并行处理。每个线程都有独立的执行路径,可以在不同的时间段内独立运行。这使得程序能够更高效地利用计算机的资源,并提高应用程序的响应速度。

        Thread类提供了许多方法来管理线程的行为,例如start()方法用于启动线程,join()方法用于等待线程的结束,sleep()方法用于暂停线程的执行等等。此外,还可以使用isAlive()方法检查线程是否处于活动状态。

1.1Thread 的常⻅构造⽅法

Thread t1 = new Thread ();
Thread t2 = new Thread ( new MyRunnable ());
Thread t3 = new Thread ( "线程 名字 " );
Thread t4 = new Thread ( new MyRunnable (), "线程 名字 " );

 1.2 Thread 的⼏个常⻅属性

 ID 是线程的唯⼀标识,不同线程不会重复

 名称是各种调试⼯具⽤到

 状态表⽰线程当前所处的⼀个情况

优先级⾼的线程更容易被调度到

关于后台线程:前台线程,会阻止进程结束。后台线程,不会阻止进程结束。JVM会在⼀个进程的所有⾮后台线程结束后,才会结束运⾏。
是否存活,即简单的理解,为 run ⽅法是否运⾏结束了
一般来说,在线程的run()方法中,可以通过检查线程的中断标志位来判断线程是否应该中断。如果线程应该中断,则应该适当地结束线程的执行,释放占用的资源,以及清除中断标志位,防止后续影响线程的执行。

 2.启动⼀个线程 - start()

       调用start创建出来新的线程。本质是start会调用系统的api,来完成创建线程的操作。

package 多线程;

public class ThreadDemo5 {
    public static void main(String[] args) {
        Thread t = new Thread(() ->{
            while (true){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();

    }
}

注意:Thread类使用start方法,启动一个线程。对于同一个Thread对象来说,start只能调用一次!!!

package 多线程;

public class ThreadDemo5 {
    public static void main(String[] args) {
        Thread t = new Thread(() ->{
            while (true){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();

        t.start();//第二次调用start会出错
    }
}

 它就会报错,意思是非法的线程状态异常。

经典面试题:
start 和run 区别

package 多线程;


class MyThread4 extends Thread{
    @Override
    public void run() {
        System.out.println("hello");
    }
}

public class ThreadDemo6 {
    public static void main(String[] args) {
        Thread t = new MyThread4();
        //t.start();//这个操作是创建一个新的线程,由新的线程执行hello
        t.run();//这个操作还是在main主线程种打印的hello
    }
}

 虽然他们打印的都是hello但是本质是不同的。

3.中断⼀个线程

方法一:

中断一个线程就是让线程提前结束,我们引入一个标志位。

package 多线程;

public class ThreadDemo7 {
    private static boolean isQuit = false;//引入一个标志位

    public static void main(String[] args) {
        Thread t = new Thread(()->{
            while (!isQuit) {
                System.out.println("正在工作中!");

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //当前是死循环,给一个提示。
            System.out.println("线程工作完毕!");
        });

        t.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("t线程结束");
        isQuit = true;
    }
}

 我们就可以让一直运行的线程提前结束。

具体线程什么时候结束,取决于在另一个线程中何时修改isQuit的值

 方法二:

Thread对象,内置了变量。

package 多线程;

public class ThreadDemo8 {
    public static void main(String[] args) throws InterruptedException{
        Thread t = new Thread(()->{
            while (!Thread.currentThread().isInterrupted()){//获取当前线程实例
                System.out.println("正在工作");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
//                    e.printStackTrace();
                    //加上break,此时抛出异常之后,线程也会结束。
                    break;
                }
            }
            System.out.println("线程执行完毕");
        });
        t.start();

            Thread.sleep(3000);

        System.out.println("t线程结束");
           //使用interrupt方法来修改刚才的标志位
        t.interrupt();

    }
}

4.等待⼀个线程 - join()

       join()是Thread类提供的一个方法,用于等待线程的结束。当调用一个线程的join()方法时,当前线程会被阻塞,直到目标线程执行完毕。

        具体来说,当一个线程A调用另一个线程B的join()方法时,线程A会暂停执行,直到线程B执行完毕。这样可以保证线程的执行顺序和协调性。

package 多线程;

public class ThreadDemo9 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            for (int i = 0; i < 5; i++) {
                System.out.println("一个线程正在工作。。。");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("线程结束");
        });
        t.start();

        t.join();
        System.out.println("这是主线程,希望在t线程后打印");
    }
}

5. 获取当前线程引用

方法一:

package 多线程;

class MyThread5 extends Thread{
    @Override
    public void run() {
        //这个代码如果想获取到线程的引用,直接使用this即可
        System.out.println(this.getId() + "," + this.getName());
    }
}

public class ThreadDemo11 {
    public static void main(String[] args) throws InterruptedException {
        MyThread5 t1 = new MyThread5();
        MyThread5 t2 = new MyThread5();
        t1.start();
        t2.start();

        Thread.sleep(1000);

        System.out.println(t1.getId() + "," + t1.getName());
        System.out.println(t2.getId() + "," + t2.getName());
    }
}

 方法二:

用Thread.currentThread()
package 多线程;
//获取当前线程引用
public class ThreadDemo12 {
    public static void main(String[] args) {
        Thread t1 = new Thread(()->{
            Thread t = Thread.currentThread();
            System.out.println(t.getName());
        });
        Thread t2 = new Thread(()->{
            Thread t = Thread.currentThread();
            System.out.println(t.getName());
        });

        t1.start();
        t2.start();
    }
}

希望大家多多支持!

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

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

相关文章

【Linux】—— 命名管道详解

命名管道是一种在操作系统中用于进程间通信的机制&#xff0c;它允许不同的进程之间通过管道进行数据交换。与匿名管道相比&#xff0c;命名管道具有更多的灵活性和功能。在本博客中&#xff0c;我们将深入探讨命名管道的概念、用途以及如何在编程中使用它们。 目录 &#xff…

多线程(看这一篇就够了,超详细,满满的干货)

多线程 一.认识线程&#xff08;Thread&#xff09;1. 1) 线程是什么1. 2) 为啥要有线程1.3) 进程和线程的区别标题1.4) Java的线程和操作系统线程的关系 二.创建线程方法1:继承Thread类方法2:实现Runnable接口方法3:匿名内部类创建Thread子类对象标题方法4:匿名内部类创建Runn…

139:leafle加载here地图(v3软件多种形式)

第139个 点击查看专栏目录 本示例介绍如何在vue+leaflet中添加HERE地图(v3版本的软件),并且含多种的表现形式。包括地图类型,文字标记的设置、语言的选择、PPI的设定。 v3版本和v2版本有很大的区别,关键是引用方法上,请参考文章尾部的API链接。 直接复制下面的 vue+leaf…

SpringCloud之Nacos的学习、快速上手

1、什么是Nacos Nacos是阿里的一个开源产品&#xff0c;是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案&#xff0c;用来实现配置中心和服务注册中心。 Nacos 快速开始 2、安装运行nacos nacos下载地址 下载地址: https://github.com/alibaba/nacos/rel…

冒泡排序-BubbleSort

1、基本思路 从数组的左边开始&#xff0c;比较两个元素的大小&#xff0c;当左边大于右边时&#xff0c;更换左右元素位置&#xff0c;否则不改变&#xff1b;接着向右移动一步&#xff0c;比较第二个元素和第三个元素的大小&#xff0c;重复上述操作&#xff0c;直到最后一个…

VMware workstation安装FreeBSD14.0虚拟机并配置网络

VMware workstation安装FreeBSD14.0虚拟机并配置网络 FreeBSD是类UNIX操作系统&#xff0c;FreeBSD带有多个软件包&#xff0c;并覆盖了广阔的应用领域&#xff0c;且都是免费和易于安装的。该文档适用于在VMware workstation平台安装FreeBSD14.0虚拟机。 1.安装准备 1.1安装…

Spring+SprinMVC+MyBatis配置方式简易模板

SpringSprinMVCMyBatis配置方式简易模板代码Demo GitHub访问 ssm-tpl-cfg 一、SQL数据准备 创建数据库test&#xff0c;执行下方SQL创建表ssm-tpl-cfg /*Navicat Premium Data TransferSource Server : 127.0.0.1Source Server Type : MySQLSource Server Versio…

QCustomPlot 曲线数据结构与存取

对了&#xff0c;我开通了微信公众号&#xff0c;计划是两边会同步更新&#xff0c;并逐步的会将博客上的文章同步至公众号中。感兴趣的朋友可以搜索“里先森sements”来关注&#xff0c;欢迎来玩~&#xff01; 通常&#xff0c;我们对QCustomPlot中的曲线数据无外乎增、删、改…

xshell配置隧道转移规则

钢铁知识库&#xff0c;一个学习python爬虫、数据分析的知识库。人生苦短&#xff0c;快用python。 xshell是什么 通俗点说就是一款强大ssh远程软件&#xff0c;可以方便运维人员对服务器进行管理操作&#xff0c;功能很多朋友们自行探索&#xff0c;今天只聊其中一个功能点那…

【RHCSA服务搭建实验】之apache

虚拟web主机类型 一、基于端口 1.vim /etc/httpd/conf.d/vhost2.conf ---- — 改变http服务默认访问路径 <directory /testweb1>allowoverride none 表示不允许覆盖其他配置require all granted 表示允许所有请求 </directory> <virtualhost 0.0.0.0:…

分布式系统中为什么需要使用消息队列

本文转载自 linkedkeeper.com 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能&#xff0c;成为异步RPC的主要手段之一。 当今市面上有很多主流的消息中间件&#xff0c;如老牌的ActiveMQ、RabbitMQ&#…

【Docker】使用Docker安装Nginx及部署前后端分离项目应用

一、Nginx介绍 Nginx是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。它是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的&#xff0c;公开版本1.19.6发布于2020年12月15日。其将源代码以类BSD许可证的形式发布&#xff0c;因它…

RLC如何通过改变频率实现输出稳压

当开关频率工作在容性区域时&#xff0c;容抗抵消完感抗还有剩余&#xff0c;所以容抗感抗可以近似为一个容抗Cr,但加上频率的改变&#xff0c;容抗又可以近似为一个可调电阻 那又改如何控制频率&#xff0c;保持输出稳压&#xff1f; 当输入与输出电压不变时&#xff0c;Rac变…

尝试解决githubclone失败问题

BV1qV4y1m7PB 根据这个视频 似乎是我的linux的github似乎下好了 我没有配置好 比如我的ssh-key 现在根据视频试试 首先需要跳转到ssh的文件夹&#xff1a; cd ~/.ssh 然后生成一个ssh-key&#xff1a; ssh-keygen -t rsa -C "<github资料里的邮箱>" 然后…

Python(18)--文件输入/输出 Ⅱ

​ 大家好&#xff01;我是码银&#x1f970; 欢迎关注&#x1f970;&#xff1a; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 前言 前一篇文章&#xff08;python(17)–文件的输入/输出-CSDN博客&#xff09;介绍了如何操作文本文件和二进制文件&#xff0c;以及对应…

跨站点请求伪造攻击 - Cross Site Request Forgery (CSRF)

什么是CSRF 最好理解CSRF攻击的方式是看一个具体的例子。 假设你的银行网站提供一个表单,允许当前登录用户将钱转账到另一个银行账户。例如,转账表单可能如下所示: <form method="post"action="/transfer"> <

SpringBoot 更新业务场景下,如何区分null是清空属性值 还是null为vo属性默认值?

先看歧义现象 值为null 未传递此属性 所以此时如何区分null 时传递进来的的null&#xff0c;还是属性的默认值null? 引入方案 引入过滤器&#xff0c;中间截获requestBodyData并保存到HttpServletRequest&#xff0c;业务层从HttpServletRequest 获取到requestBodyData辅…

PCIe 5.0硬件

一、PCIe 5.0概述 (1)什么是PCIe 5.0 第五代快速周边组件互连称为PCI Express 5.0(Peripheral Component Interconnect Express 5.0),也称为第五代PCIe、PCIe 5、PCI v5或简称为PCIe 5.0。PCIe技术于2003年首次推出,现已成为使用点对点访问总线将高速组件连接到主板的标准接…

基于springboot的一个IT人才招聘网站系统源码+数据库+部署文档,公司可以发布岗位需求,求职者查找岗位并递交简历等

介绍 实现一个IT人才招聘系统&#xff0c;公司可以发布岗位需求&#xff0c;求职者查找岗位并递交简历等 启动 1. 主要技术版本 技术名称版本SpringBoot2.5.0MySQL8.0Redis6.2.0 2. 本地启动部署 2.1 数据库数据源部署 src/main/resources/application.yaml 配置文件&am…

Camera理论知识和基本原理(1)

1. 前言 本篇文章为Camera系列文章的第一篇&#xff0c;主要阐述Camera摄像头的基础理论知识&#xff0c;解决Camera硬件或Camera软件开发的一些困惑。该系列文章主要围绕Android操作系统进行&#xff0c;并涉及Android系统上Camera的协议、实现和应用。 2. Basic Concepts …