Java线程基础知识和使用

news2024/12/29 13:42:32

目录

什么是线程

Java中线程的使用

线程的实现

并运行一个线程

如何为线程命名

查看当前jvm中运行的所有线程

线程池的基本使用

线程休眠

设置线程的优先级(都仅供参考)

线程的插队

线程的中断

线程的分类

线程的状态


什么是线程

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。在多核CPU中,利用多线程可以实现真正意义上的并行执行。一个进程的所有任务都在线程中执行,进程要想执行任务,必须得有线程,进程至少要有一条线程,程序启动会默认开启一条线程,这条线程被称为主线程或 UI 线程。

一个程序有多个进程,一个进程有多个线程

  • 单线程:单线程指的是程序只有一个执行线程,按照顺序逐个执行任务。当一个任务执行完毕后,才能执行下一个任务。
  • 多线程:多线程指的是程序可以同时执行多个线程,每个线程可以独立执行任务。多线程可以同时处理多个任务,提高程序的执行效率。

Java中线程的使用

线程的实现

线程的实现有三种方法

1.实现Runnable接口

 Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
              
            }
        });

2.实现Callable接口(有返回值)

class SubTask implements Callable<Integer>{

    @Override
    public Integer call() throws Exception {
        return null;
    }
}

并运行一个线程

1.创建线程,通过Thread类来创建一个子线程

 // 创建子线程
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                for (char i ='A';i<'Z';i++){
                    System.out.println(Thread.currentThread().getName()+i);
                }
            }
        },"子线程");

2.运行子线程

thread.start();

3.输出结果为 

如何为线程命名

1.在创建线程时命名

   Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
            }
        },"子线程1");

2.通过setname方法来命名

Thread thread = new Thread();
thread.setName("子线程")

查看当前jvm中运行的所有线程

    public static void main(String[] args) {
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
        ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
        for(ThreadInfo threadInfo:threadInfos){
            System.out.println(threadInfo.getThreadId()+"-------------"+threadInfo.getThreadName());
        }

    }

线程池的基本使用

案例:实现10000以内的数字相加之和

 ExecutorService executorService = Executors.newFixedThreadPool(5);
        int sum = 0;
        for (int i = 1;i<=10000;i+=2000){
            // 向线程池提交一个线程任务
            // 线程池分配一个空闲线程执行任务
            Future<Integer> submit = executorService.submit(new SubTask(i, i + 2000));
            Integer num = submit.get();
            sum+=num;
        }
        System.out.println(sum);

        executorService.shutdown();
  • ExecutorService 线程池的统一实现接口

  • Executors 线程池的工具类
  • newFixedThreadPool(5) 固定线程池数量

线程休眠

线程休眠,是由用户控制的(用户主动调用相关方法才能使线程睡眠),睡眠恢复则是自动完成的,睡眠时间到了则恢复到就绪态,睡眠时线程不会释放对象锁。

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

注意:线程的休眠需要抛出异常

设置线程的优先级(都仅供参考)

多个线程之间一般是进行抢占式的进行,谁先抢到谁就先执行

有两种方法

1.线程对象.setPriority(1) :1最小,10最大

2.Thread.yield() :表示该线程在抢占后让出

线程的插队

通过方法 :线程对象.join();

  public static void main(String[] args) {
        MyTask task = new MyTask();
        Thread thread1 = new Thread(task,"线程1");
        // 设置线程的优先级 (仅供参考)
        thread1.start();
        // 子线程的插队 调用join方法进行插队
        try {
            thread1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主线程结束");
    }

join()方法通过wait()实现,是被插队的线程(主线程),处于等待状态。

线程的中断

通过interrupt()方法来使线程进入中断,同时要想线程进入中断,该线程必须有能接受中断的状态,也就是该线程必须有进行过join等方法抛出过InterruptedException异常

同时也可以通过Thread.currentThread()的isInterrupted()方法来判断当前线程是否中断

是则返回ture,否则返回false

  public static void main(String[] args) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("子线程开始执行");
                try {
                    Thread.sleep(6000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // 检查当前线程是否处于中断状态,Thread.currentThread().isInterrupted()是则返回ture,不是则为false
                while (!Thread.currentThread().isInterrupted()){
                    System.out.println("没中断");
                }

                System.out.println("子线程结束");
            }
        });
        t.start();
}

线程的分类

  • 用户线程:由应用程序开发者创建和管理,不依赖于操作系统。
  • 守护线程:在后台运行,通常用于执行后台任务。

线程的状态

通过Thread.state的这个枚举类的底层代码我们可以发现,线程共有六种状态

  1. 新建状态(New):当一个线程的实例被创建即使用new关键字和Thread类或其子类创建一个线程对象后,此时该线程处于新建状态。处于新建状态的线程有自己的内存空间,但该线程并没有运行,此时线程还不是活着的。
  2. 运行状态(Runnable):通过调用线程实例的start()方法来启动线程使线程进入就绪状态。处于就绪状态的线程已经具备了运行条件,但还没有被分配到CPU即不一定会被立即执行,此时处于线程就绪队列,等待系统为其分配CPU。
  3. 阻塞状态(Blocked):通过调用join()、sleep()、wait()或者资源被暂用使线程处于阻塞状态。处于Blocking状态的线程仍然是活着的。
  4. 等待状态(waiting):无期限等待另一个线程执行特定操作的线程处于此状态。
  5. 定时等待状态(timed_waiting):等待另一个线程执行操作达到指定等待时间的线程处于此状态。

  6. 终止状态(Terminated):当一个线程的run()方法运行完毕或被中断或被异常退出,该线程到达死亡状态。

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

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

相关文章

Walmart 砸23亿美元收购 Vizio | 百能云芯

美国零售巨头沃尔玛&#xff08;Walmart&#xff09;宣布以 23 亿美元的价格收购智能电视品牌 Vizio&#xff0c;该举措旨在加速其广告业务 Walmart Connect 的增长。市场研究机构 TrendForce 看好此收购案&#xff0c;认为这有助于 Vizio 挑战三星的地位&#xff0c;成为美国第…

一个诗词网站的设计与实现

诗词网 0、前言 ​  前段时间非常喜欢诗词&#xff0c;又恰逢想开发一个社区类的系统&#xff0c;于是便有将两者结合起来的构想&#xff0c;说干就干&#xff0c;便有了诗词网&#xff08;诗词社区系统&#xff09;这个项目。 ​  由于是利用空闲时间进行开发&#xff0c…

更高效的构建工具-vite

更高效的构建工具-vite 前言Vite是什么Vite和webpack的比较1. 运行原理2. 使用成本 Vite的初体验 前言 首先我们要认识什么时构建工具&#xff1f; 企业级项目都具备什么功能呢&#xff1f; Typescript&#xff1a;如果遇到ts文件&#xff0c;我们需要使用tsc将typescript代码…

百度智能云分布式数据库 GaiaDB-X 与龙芯平台完成兼容认证

近日&#xff0c;百度智能云的分布式关系型数据库软件 V3.0 与龙芯中科技术股份有限公司的龙芯 3C5000L/3C5000 处理器平台完成兼容性测试&#xff0c;功能与稳定性良好&#xff0c;获得了龙架构兼容互认证证书。 龙芯系列处理器 通用 CPU 处理器是信息产业的基础部件&#xf…

Mac远程连接Windows 11

1. Windows配置 1.1 打开远程连接权限 打开“控制面板”搜索“远程”&#xff0c;选择“允许远程访问你的计算机”这一项。 1.2 添加远程连接用户 打开“计算机管理”&#xff0c;并在用户下新增“新用户”&#xff0c;share是我自己使用的名字&#xff0c;这个名字不固定随…

CSP-J 2023 T3 一元二次方程

文章目录 题目题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 题目传送门题解思路总代码 提交结果尾声 题目 题目背景 众所周知&#xff0c;对一元二次方程 a x 2 b x c 0 , ( a ≠ 0 ) ax ^ 2 bx c 0, (a \neq 0) ax2bxc0,(a0)&#xff0c;可…

关于dxf文件中,多段线凸度的计算

1.前言 在前面的CAD中的dxf文件解析(二)中讲到了一些CAD的dxf文件解析点、线、圆弧、圆、块等的思路。下面提供链接&#xff1a; &#xff08;二): CAD中的dxf文件解析(二):dxflib的使用_不爱学习 未完待续的博客-CSDN博客_dxflib (一)&#xff1a;CAD中的dxf文件解析(一):准备…

2024.2.22 C++QT 作业

思维导图 练习题 1>完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面。如果账…

如何将 .NET Aspire 应用程序部署到 Azure Container App

作者&#xff1a;Jiachen Jiang 排版&#xff1a;Alan Wang 最近发布的用于构建云原生应用程序的 .NET Aspire 与 Azure Container App&#xff08;ACA&#xff09;非常匹配。.NET Aspire 旨在轻松管理由一系列相互依赖的微服务组成的应用程序。Azure Container App 专为微服务…

Linux-时间接口-005

学习重点&#xff1a; 1.函数接口 2.【ls-l】命令的实现1【time】 1.1函数原型 【time_t time(time_t *tloc);】1.2函数功能 返回1970-1-1到现在的秒数&#xff08;格林威治时间&#xff09;1.3函数参数 1.3.1【tloc】 存放秒数空间首地址 存放的秒数&#xff1a;如果【t…

MySQL 窗口函数温故知新

本文用于复习数据库窗口函数&#xff0c;希望能够温故知新&#xff0c;也希望读到这篇文章的有所收获。 本文以&#xff1a;MySQL为例 参考文档&#xff1a; https://www.begtut.com/mysql/mysql-window-functions.html 使用的样例数据&#xff1a;https://www.begtut.com/m…

提高效率、降低成本:外贸企业必备好用ERP软件盘点

好用的外贸ERP软件有哪些&#xff1f;本期为您盘点的外贸ERP软件有&#xff1a;Zoho Books&#xff0c;孚盟M8&#xff0c;富通天下&#xff0c;睿贝软件。 外贸ERP系统是什么 企业资源规划&#xff08;ERP&#xff09;系统是一种先进的管理软件&#xff0c;尤其是在外贸和国际…

如何使用Docker部署开源Leanote蚂蚁笔记并发布个人博客至公网

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1. 安装Docker2. Docker本地部署Leanote蚂蚁笔记3. 安装…

通过eeprom验证FPGA实现的单字节/页读写IIC接口时序

1、概括 前文设计基于FPGA的IIC接口模块&#xff0c;本文将使用eeprom来验证该模块的设计。为了便于查看读写波形&#xff0c;采用两个按键来控制对eeprom数据的读写&#xff0c;当按键0按下后&#xff0c;FPGA向eeprom的前64个存储地址写入地址对应的数据&#xff0c;当按键1按…

文件上传漏洞--Upload-labs--Pass20--数组绕过

一、漏洞原理 漏洞来源&#xff1a;count()函数漏洞。 现自定义一个数组 arr[]&#xff0c;定义arr[0]1,arr[3]2, 此时count(arr)的值为2&#xff0c;则arr[count[arr]]即为arr[2]&#xff0c;但是arr[2]未定义&#xff0c;即为一个空值&#xff0c;若使用count()函数的本意是…

大数据计算技术秘史(上篇)

在之前的文章《2024 年&#xff0c;一个大数据从业者决定……》《存储技术背后的那些事儿》中&#xff0c;我们粗略地回顾了大数据领域的存储技术。在解决了「数据怎么存」之后&#xff0c;下一步就是解决「数据怎么用」的问题。 其实在大数据技术兴起之前&#xff0c;对于用户…

【TCP/IP】组播

一、组播介绍 组播&#xff08;Multicast&#xff09;是网络技术中数据传输的一种方法&#xff0c;它允许将数据包同时发送给一组指定的目标&#xff0c;而不是单个的目标&#xff08;单播 Unicast&#xff09;或所有可能的目标&#xff08;广播 Broadcast&#xff09;。组播传…

Python的自定义函数

Python的自定义函数 自定义函数的作用匿名函数语法示例 自定义函数语法示例 自定义函数的作用 定制化需求降低代码重复编写 匿名函数 匿名函数&#xff0c;可以用lambda关键字定义。通过lambda构造的函数可以没有名称&#xff0c;即在自定义匿名函数时&#xff0c;所有代码可…

【智能家居】7、主程序编写+实现语音、网络和串口功能

需要毕业论文私信有偿获取 截止目前mainPro.c代码 #include <stdio.h> #include <string.h>#include "controlDevices.h" #include "inputCmd.h"struct Devices *findDevicesName(char *name,struct Devices *phead){struct Devices *tmp=ph…

得物面试:Kafka消息0丢失,如何实现?

得物面试&#xff1a;Kafka消息0丢失&#xff0c;如何实现&#xff1f; 尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面…