首页/新闻资讯/正文详情

【Java】线程概念

发布时间:2026/11/3 19:24:22 来源:云帆数科 栏目:资讯中心
【Java】线程概念
1.Thread 类中start()和run()的区别方法本身区别1start()a是启动线程的方法属于Thread的原生方法。b调用后会向操作系统申请创建一个新的独立线程由 JVM 自动调用该线程的run()方法。c一个线程对象只能调用一次start()重复调用会抛出IllegalThreadStateException。2run()a是线程的任务方法来自Runnable接口Thread实现了 Runnable。b里面写线程要执行的业务逻辑直接调用run()只是普通的方法调用不会创建新线程。c可以反复调用只是当成普通成员方法执行。运行结果区别1调用 start()开启新线程任务在新线程中执行和主线程并发运行执行顺序由 CPU 调度决定。2直接调用 run()不开启新线程任务在当前调用线程一般是主线程里串行执行和普通方法调用没有区别。总结1start()创建线程 自动执行 run2run()只是任务体直接调用不会新开线程。代码测试 start ()public static void main(String[] args) { Thread myThreadnew Thread(()-{ for(int i0;i5;i) { try{ Thread.sleep(2000); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println(Thread.currentThread().getName() 执行i); } },自定义线程); //start(): 开启新线程,jvm自动调用run() myThread.start(); // 主线程同时循环观察并发效果 for(int i0;i5;i) { try{ Thread.sleep(2000); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println(Thread.currentThread().getName() 执行 i); } }1两个线程并发交替输出自定义线程 和 main 的打印穿插在一起顺序每次运行可能不一样由 CPU 调度2原因start()创建了新线程两个线程一起跑测试 run ()public static void main(String[] args) { Thread myThreadnew Thread(()-{ for(int i0;i5;i) { try{ Thread.sleep(2000); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println(Thread.currentThread().getName() 执行i); } },自定义线程); //start(): 开启新线程,jvm自动调用run() // myThread.start(); myThread.run(); // 主线程同时循环观察并发效果 for(int i0;i5;i) { try{ Thread.sleep(2000); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println(Thread.currentThread().getName() 执行 i); } }1先全部跑完 run 里面的循环再跑后面 main 的循环串行执行而且打印出来的线程名都是 main2重点哪怕线程对象名字叫 “自定义线程”直接调用run()时执行线程依然是主线程 main没有开启新线程。2.Thread 类基本用法线程创建Java 创建线程主要有两种常见方式1继承Thread类重写run()方法2实现Runnable接口传入 Thread 构造方法注意run() 是线程任务体直接调用 run () 只是普通方法调用调用 start () 才会真正开启新线程1方式 1继承 Threadclass MyThread extends Thread{ Override public void run() { System.out.println(继承Thread方式线程执行 Thread.currentThread().getName()); } } // 使用 MyThread t1 new MyThread(); t1.start();2实现 Runnable 接口class MyTask implements Runnable{ Override public void run() { System.out.println(实现Runnable方式线程执行 Thread.currentThread().getName()); } } // 使用 Thread t2 new Thread(new MyTask(), 线程A); t2.start();线程中断 interrupt ()interrupt()给线程设置中断标记不是立刻杀死线程isInterrupted()判断当前线程中断标记不清除标记Thread.interrupted()判断中断标记同时清除标记如果线程处于sleep()/wait()阻塞状态时收到中断会抛出InterruptedException并清空中断标记Thread t new Thread(() - { while (!Thread.currentThread().isInterrupted()){ System.out.println(线程正在运行); try { Thread.sleep(500); } catch (InterruptedException e) { // 休眠中被中断抛异常标记会被清空 System.out.println(收到中断信号退出); break; } } }); t.start(); // 主线程3秒后中断子线程 Thread.sleep(3000); t.interrupt();核心思想中断是协商机制由线程自己决定什么时候退出不是强制终止。线程等待 join ()join()让调用这个方法的线程等待目标线程执行完毕再继续往下执行。1t.join()无限等待直到 t 线程结束2t.join(1000)最多等待 1000ms超时就不再等Thread t new Thread(() - { for (int i 0; i 5; i) { System.out.println(子线程 i); try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } } }); t.start(); System.out.println(主线程等待子线程完成); t.join(); System.out.println(子线程执行完毕主线程继续执行);线程休眠 sleep ()Thread.sleep(long ms)静态方法让当前正在执行的线程进入休眠交出 CPU时间到了之后重新进入就绪队列等待调度。1休眠期间不释放锁2会抛出受检异常 InterruptedException3是静态方法写在哪个线程代码里就是哪个线程休眠System.out.println(开始休眠); try { Thread.sleep(2000); // 当前线程休眠2秒 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(休眠结束);获取线程实例 currentThread ()Thread.currentThread()静态方法返回当前正在执行这行代码的线程对象实例。经常用来获取当前线程名字、判断线程身份。Thread t new Thread(() - { Thread now Thread.currentThread(); System.out.println(当前线程名称 now.getName()); System.out.println(当前线程ID now.getId()); }); t.setName(工作线程); t.start(); // 获取主线程实例 Thread mainThread Thread.currentThread(); System.out.println(主线程名字 mainThread.getName());总结代码线程创建Runnable 方式public static void main(String[] args) { // 创建任务 Runnable task()-{ System.out.println(子线程开始执行); for(int i0;i3;i) { System.out.println(子线程打印i); } System.out.println(子线程结束); }; // 把任务交给Thread对象启动线程 Thread subThreadnew Thread(task,测试线程); subThread.start(); System.out.println(主线程执行完毕); }知识点1start()向操作系统申请开启新线程自动调用run()2直接调用run()不会开新线程只是普通方法调用线程中断 interrupt ()public static void main(String[] args) throws InterruptedException { Runnable task()-{ while(!Thread.currentThread().isInterrupted()){ try{ System.out.println(子线程正在运行...); Thread.sleep(500); }catch(InterruptedException e){ // sleep 阻塞时收到中断抛异常中断标记自动清除 System.out.println(收到中断信号子线程退出!!); break; } } }; Thread subThreadnew Thread(task,子线程); subThread.start(); // 主线程休眠3秒 Thread.sleep(3000); System.out.println(主线程发起中断); subThread.interrupt(); }1interrupt() 不是强制杀死线程只是设置中断标记2sleep/wait阻塞状态下被中断 → 抛出InterruptedException标记清空线程等待 join ()public static void main(String[] args)throws InterruptedException { Thread subThreadnew Thread(()-{ for(int i0;i3;i) { System.out.println(子线程工作i); try{ Thread.sleep(800); }catch(InterruptedException e){ e.printStackTrace(); } } System.out.println(子线程执行完成); }); subThread.start(); System.out.println(主线程等待子线程完成....); // 主线程阻塞等待subThread执行完毕才继续往下执行 subThread.join(); System.out.println(主线程子线程结束了我继续执行); }知识点t.join()哪个线程调用这个方法哪个线程就等待 t 线程结束线程休眠 sleep ()3.进程与线程的区别和联系什么是进程进程Process可以理解成一个正在运行的程序实例。当你双击打开微信操作系统就会为微信创建一个进程。操作系统会给这个进程分配独立的资源独立虚拟地址空间、文件描述符、堆、信号、权限等。进程之间相互隔离一个进程崩溃一般不会影响其他进程。特点1拥有独立的内存空间资源相互隔离2进程切换开销大需要刷新页表、切换上下文3进程是资源分配的最小单位什么是线程线程Thread也叫轻量级进程是进程内部一条独立的执行流。一个进程内部可以有多个线程这些线程共享这个进程的绝大部分资源。比如微信进程里一个线程负责收消息、一个线程负责刷朋友圈、一个线程负责文件下载。特点1同一个进程内的线程共享进程的地址空间、全局变量、文件资源2线程切换开销很小只需要保存少量寄存器上下文3线程是CPU 调度的最小单位注意线程没有独立的内存只有自己私有的栈、程序计数器、寄存器进程和线程的联系线程依附于进程线程不能脱离进程单独存在进程是线程的容器进程销毁里面所有线程都会跟着销毁。一个进程至少包含 1 个线程主线程。二者都可以实现并发多个进程并发、同一个进程内多个线程并发。进程和线程都有自己的生命周期创建、就绪、运行、阻塞、终止。进程内线程通信更方便共享全局变量进程间通信需要专门 IPC 手段管道、消息队列、共享内存、socket 等。进程和线程的核心区别什么时候用多进程什么时候用多线程优先多进程1任务之间需要强隔离一个任务出错不能影响其他任务2需要充分利用多核 CPUPython GIL 场景下多进程是常用方案3占用资源比较独立。优先多线程1任务之间需要频繁通信、交换数据2IO 密集型任务网络请求、读写文件创建开销小3不需要强隔离追求切换速度。总结进程资源容器隔离性强开销大线程执行流共享资源开销小关系进程包含线程进程负责资源线程负责干活

相关推荐

全网都在扒“作者是谁“,没人关心它干了啥:百度这个开源OCR,被一段八卦盖住了真本事
全网都在扒“作者是谁“,没人关心它干了啥:百度这个开源OCR,被一段八卦盖住了真本事

全网都在扒"作者是谁",没人关心它干了啥:百度这个开源OCR,被一段八卦盖住了真本事 【免费下载链接】Unlimited-OCR-2 项目地址: https://ai.gitcode.com/hf_mirrors/baidu/Unlimited-OCR-2 今年6月,百度在GitHu… · 2026/11/3 19:23:22

不再需要密码保护?取消PDF密码保护的方法
不再需要密码保护?取消PDF密码保护的方法

PDF设了密码,原本是为了安全,但如果后续不再需要保护了,每次使用都得输一遍密码,还是很耽误时间的。想要取消PDF的密码保护,得先看你遇到的是哪一种“锁”。PDF通常有两把锁:一把叫“打开密码”&#xff0c… · 2026/11/3 19:23:22

为了 OCR 上一个 3B 大模型,是不是过度设计了?
为了 OCR 上一个 3B 大模型,是不是过度设计了?

为了 OCR 上一个 3B 大模型,是不是过度设计了? 【免费下载链接】Unlimited-OCR-2 项目地址: https://ai.gitcode.com/hf_mirrors/baidu/Unlimited-OCR-2 先说个真事儿。 一位做知识库的朋友,手里堆着几百份扫描版合同和年报。以前他… · 2026/11/3 19:23:22

EtherCAT从站控制器LAN9252原理与工程实践解析
EtherCAT从站控制器LAN9252原理与工程实践解析

简介:这份PDF培训材料面向工业自动化、嵌入式控制与工业互联网方向的学习者和工程师,围绕EtherCAT实时以太网协议及Microchip LAN9252从站控制器展开,适合需要理解从站开发、网络通信与实时同步机制的读者。内容从EtherCAT的周期时间、低抖动… · 2026/11/3 20:00:36

技术债证券化对测试团队的影响与应对策略
技术债证券化对测试团队的影响与应对策略

1. 技术债证券化现象解析:当技术问题变成金融产品 在软件工程领域摸爬滚打十几年,我见证过各种形式的技术债处理方式,但最近两年出现的"技术债证券化"现象着实让人心惊。这个看似金融创新的方案,本质上是用金融工具包装… · 2026/11/3 20:00:36

使用Docker Compose部署Prometheus与Grafana监控系统
使用Docker Compose部署Prometheus与Grafana监控系统

1. 项目概述监控系统是现代IT基础设施中不可或缺的一部分,而Prometheus和Grafana的组合已经成为监控领域的黄金标准。这套方案不仅适用于大型分布式系统,也能完美服务于中小型应用。我曾在多个生产环境中部署过这套监控栈,它的灵活性和强大功… · 2026/11/3 20:00:36

ASP检测手机客户端并跳转:User-Agent移动端分流实践
ASP检测手机客户端并跳转:User-Agent移动端分流实践

接手一个跑了快十年的 ASP 老站,最怕的不是代码有多老,而是需求方一句轻描淡写的话:手机打开要自动进手机版。听起来就是几行 if 的事,真做起来,iPad 到底算不算手机、微信里点开算不算、搜索引擎的爬虫抓到的是哪个版… · 2026/11/3 20:00:36

开发者健康监测系统:用代码数据守护程序员健康
开发者健康监测系统:用代码数据守护程序员健康

1. 项目背景:当代码与健康相遇 凌晨三点的办公室,显示器蓝光映照着程序员疲惫的面容,咖啡杯早已见底,键盘敲击声在寂静的办公室里格外清晰。这样的场景在IT行业太常见了——根据2022年开发者生态调查报告,超过67%的程序… · 2026/11/3 20:00:36

智算中心网络架构演进与Border Leaf设计解析
智算中心网络架构演进与Border Leaf设计解析

1. 智算中心网络架构的演进挑战智算中心作为新一代算力基础设施,其网络架构设计正面临前所未有的流量模型变革。传统数据中心以"南北向"流量为主(客户端到服务器),而智算中心中服务器间"东西向"流量占比已超过… · 2026/11/3 19:59:36

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码