JavaSE-多线程(1)- 线程概念

JavaSE多线程 编写一个类,直接继承java. lang. Thread,重写run方法。 阅读详情

JavaSE-多线程(1)- 线程概念

进程:

进程是程序的一次执行过程,在java中启动main函数就是启动了一个JVM进程
例如,当执行下面两个类时,即启动了两个进程:

public class ProcessTest {

    public static void main(String[] args) {
        while(true){
            try {
                Thread.sleep(2000);
                System.out.println("Process1 running ...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class ProcessTest2 {

    public static void main(String[] args) {
        while(true){
            try {
                Thread.sleep(2000);
                System.out.println("Process2 running ...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}


线程:

线程可以理解成是进程的更小执行单元,一个进程在执行过程中可以产生多个线程,与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程,在上例中一个进程只产生了一个线程即主线程,在以下例子中,共有三个线程在运行即 main ,Thread-0,Thread-1 。

public class ThreadTest extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            try {
                Thread.sleep(2000);
                System.out.println(Thread.currentThread().getName() + " running...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        new ThreadTest().start();
        new ThreadTest().start();
        for (int i = 0; i < 100; i++) {
            try {
                Thread.sleep(2000);
                System.out.println(Thread.currentThread().getName() + " running...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
main running...
Thread-1 running...
Thread-0 running...
Thread-1 running...
main running...
Thread-0 running...
Thread-1 running...
main running...
........................

实现多线程的三种方式:

  • 继承 Thread 类
  • 实现 Runnable 接口
  • 通过线程池 Executors.newCachedThreadPool 启动

线程常用方法

Thread.sleep(long millis) :

一定是当前线程调用此方法,当前线程进入TIMED_WAITING状态,但不释放对象锁,millis后线程自动苏醒进入就绪状态。作用:给其它线程执行机会的最佳方式。

package com.hs.example.base.multithread.day01;

public class SleepTest implements Runnable {


    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getState());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new SleepTest());
        thread.start();

        do {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(thread.getState());
        } while (!Thread.State.TERMINATED.equals(thread.getState()));
    }
}

程序运行结果为:

RUNNABLE
TIMED_WAITING
RUNNABLE
RUNNABLE
TIMED_WAITING
........省略
TERMINATED
Thread.yield():

yield 字面意思为让步,jdk文档解释为 暂停当前正在执行的线程对象,并执行其他线程,调用该方法会释放CPU资源,但不会释放锁资源,当前线程从运行中状态进入就绪(RUNNABLE)状态,Thread.yield()不会导致阻塞。该方法与sleep()类似,只是不能由用户指定暂停多长时间

join :

等待该线程终止,一般使用方法为在当前线程A调用线程B的join方法,此时A线程会等待B线程执行完才会继续执行。

public class JoinTest implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }

    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName() + " start...");
        Thread thread = new Thread(new JoinTest());
        thread.start();
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " end...");
    }
}

此例中执行结果为:

main start...
Thread-0 0
Thread-0 1
Thread-0 2
Thread-0 3
Thread-0 4
Thread-0 5
Thread-0 6
Thread-0 7
Thread-0 8
Thread-0 9
main end...

但是如果注释 thread.join(); 执行结果为:

main start...
main end...
Thread-0 0
Thread-0 1
Thread-0 2
Thread-0 3
Thread-0 4
Thread-0 5
Thread-0 6
Thread-0 7
Thread-0 8
Thread-0 9

线程状态:


下例中,一个线程运行时,另外一个线程属于阻塞状态

public class BlockedThreadTest implements Runnable {

    private final Object o = new Object();

    @Override
    public void run() {
        synchronized (o) {
            System.out.println("run begin," + Thread.currentThread().getName() + "  " + Thread.currentThread().getState());
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("run end," + Thread.currentThread().getName() + "  " + Thread.currentThread().getState());
        }
    }

    public static void main(String[] args) {
        Runnable runnable = new BlockedThreadTest();
        Thread t1 = new Thread(runnable);
        t1.setName("t1");
        t1.start();
        Thread t2 = new Thread(runnable);
        t2.setName("t2");
        t2.start();
        do {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(t1.getName() + ":" + t1.getState() + "  " + t2.getName() + ":" + t2.getState());
        } while (!Thread.State.TERMINATED.equals(t1.getState()) || !Thread.State.TERMINATED.equals(t2.getState()));
    }
}
run begin,t1  RUNNABLE
t1:TIMED_WAITING  t2:BLOCKED
t1:TIMED_WAITING  t2:BLOCKED
t1:TIMED_WAITING  t2:BLOCKED
t1:TIMED_WAITING  t2:BLOCKED
t1:TIMED_WAITING  t2:BLOCKED
t1:TIMED_WAITING  t2:BLOCKED
t1:TIMED_WAITING  t2:BLOCKED
t1:TIMED_WAITING  t2:BLOCKED
t1:TIMED_WAITING  t2:BLOCKED
run end,t1  RUNNABLE
run begin,t2  RUNNABLE
t1:TERMINATED  t2:TIMED_WAITING
t1:TERMINATED  t2:TIMED_WAITING
t1:TERMINATED  t2:TIMED_WAITING
t1:TERMINATED  t2:TIMED_WAITING
t1:TERMINATED  t2:TIMED_WAITING
t1:TERMINATED  t2:TIMED_WAITING
t1:TERMINATED  t2:TIMED_WAITING
t1:TERMINATED  t2:TIMED_WAITING
t1:TERMINATED  t2:TIMED_WAITING
t1:TERMINATED  t2:TIMED_WAITING
run end,t2  RUNNABLE
t1:TERMINATED  t2:TERMINATED

参考:
https://www.zhihu.com/question/264627396
https://blog.youkuaiyun.com/shinecjj/article/details/82995309

Kali Linux实战:用Impacket的secretsdump.py快速提取Windows域控哈希(附避坑指南) 本文详细介绍了如何在Kali Linux中使用Impacket的secretsdump.py脚本快速提取Windows域控哈希,包括环境准备、原理剖析、实战操作及常见问题解决方案。特别适合CTF竞赛和网络信息安全爱好者学习,提升渗透测试效率。 阅读详情

相关推荐

保姆级教程:在树莓派4B上用V4L2驱动USB摄像头(附完整代码)

本文提供树莓派4B上使用V4L2驱动USB摄像头的完整教程,涵盖环境配置、V4L2架构解析、代码实现及问题排查。通过详细步骤和完整代码示例,帮助开发者快速掌握嵌入式Linux下的摄像头驱动开发,解决实际应用中的兼容性和性能问题。

weixin_30312563的博客 382

Java多线程执行SQL语句

可以使用Java中的多线程技术来执行SQL语句。 可以使用Java中的JDBC API来执行SQL语句,并且通过创建多个线程并行执行SQL语句来提高执行效率。 不过,请注意在多线程环境中使用JDBC时需要特别注意线程安全性问题。因为JDBC API并不是线程安全的,因此需要通过特殊的方式来解决这个问题。 推荐使用数据库连接池,在每个线程中使用单独的数据库连接来执行SQL语句。这样可以保证线程安全并...

weixin_42603332的博客 1304

有限元中的对称魔法:用1/6模型算整个涡轮叶片(含MATLAB代码)

本文深入解析了有限元分析中针对循环对称结构的高效求解策略。通过利用涡轮叶片等结构的几何重复性,仅需对1/6基本扇区建模并施加循环对称条件,即可精确推演整体力学行为,大幅降低计算规模。文章从数学原理推导到MATLAB代码实现,提供了完整的实战指南,适用于旋转机械的静力、模态及谐响应分析。

fire9的博客 311

java 多线程执行 sql 语句(用ExecutorService实现)

可应用场景: 数据量较大, 而单次执行sql时间长 数据量过大的情况, 单线程执行需要很长一段时间,我们需要开启多线程执行, 注意mysql支持的连接数, 不要超过这个连接数 创建 服务, Executors.newFixedThreadPool(70); 里面的数字根据自己的需求和mysql的能力来决定 比如我这边开70个 这里我用的读取文件流之后开启线程, 具体场景根据需求自己定 public void test() throws Exception{ List<List&lt.

dalter的博客 3771

树莓派介绍与可安装的操作系统

树莓派是一款由英国树莓派基金会开发的信用卡大小的微型计算机。处理器(CPU)内存(RAM)图形处理器(GPU)USB 接口网络接口(以太网和 Wi-Fi)视频输出(HDMI)音频输出用户只需添加电源、存储卡、显示器和输入设备(键盘、鼠标),就可以将其当作一台功能齐全的电脑使用。主要特点:低成本:价格亲民,适合教育和个人项目。小巧便携:体积小,便于携带和部署。功能强大:支持多种编程语言和操作系统,功能不逊于传统电脑。树莓派从最初的教育工具发展成为功能强大的多用途平台。最新的树莓派 5。

像风一样自由的博客 2199

M6 Mac mini涨价2500值不值?深度拆解硬件成本与购买决策

统一内存架构将CPU、GPU和内存封装在一起,通过共享高带宽内存池提升数据交换效率,尤其适合本地AI推理和视频渲染等场景。在苹果生态中,起步内存和存储的配置直接决定设备生命周期,因为后期无法自行升级。M6 Mac mini将起步内存从16GB提升至24GB、存储从256GB提升至512GB,同时芯片制程和GPU核心数均有升级,持续负载性能保持率明显改善。对于开发者、内容创作者和本地大模型推理用户,这些变化能转化为实际效率收益;而轻度办公用户则可能面临性能冗余。理解硬件成本结构与自身工作流需求,才能判断这25

weixin_30846347的博客 268

Java利用多线程执行SQL减少执行时间提高效率

Java利用多线程执行SQL减少执行时间提高效率 首先这是个人在实际的项目中使用的代码,部分敏感代码没有上,不过不影响对代码的理解: 1.实现自己的线程 /** * * @author * @date */ package com.mis.pm.thread; import java.util.List; import java.util.Map; import com.mis.core.service.BaseServic

foreversilent的专栏 7932

损失函数大汇总(五十三)(Boundary Loss附公式推导与代码)

摘要 Boundary Loss是一种针对图像分割任务的新型损失函数,特别适用于高度类别不平衡的细粒度分割场景。与传统的区域型损失(如Dice、交叉熵)不同,它通过计算预测边界与真实边界之间的距离来优化模型,更关注边界精度而非区域重叠。核心思想是利用距离图(distance map)将边界约束转化为区域积分形式,实现端到端训练。具体实现中,损失函数为预测概率与距离图的点积,梯度仅取决于距离图,具有明确的空间引导性。相比区域型损失,Boundary Loss能更好处理小目标、细长结构等边界敏感任务,可与Dic

悦学共鸣,温柔以待,汇聚光芒,共同成长 240

Java多线程批量执行sql

当遇到大sql批量导入时几十万上百万数据,使用plsql执行等都是非常的慢。因此开发一套自定义线程池处理sql: 1,线程代码 import java.util.ArrayList; /** * @ClassName: com.ai.order.esb.yulang.tools.handle * @Description: TODO * @version: v1.0.0 * @a...

远方 8405

爬虫逆向:Hook 技术原理与实战

Hook 技术​(钩子技术)是一种通过拦截和修改程序执行流程的技术手段。它允许开发者在目标程序的特定位置插入自定义代码,以改变程序的默认行为或获取运行时信息。Hook 技术广泛应用于调试、逆向工程、性能分析、安全防护等领域。Hook 技术在爬虫逆向中非常有用,能够有效获取和修改目标程序的数据。通过合理使用 Hook 工具和技术,可以显著提升爬虫的效率和成功率。但使用时需注意法律和道德问题,确保行为合规。

数据知道的博客 1万+

Hermes 教程 03:Skills 系统

摘要:Hermes Skills是一种自我改进机制,可将解决问题的经验保存为可复用技能文档。v0.13.0版本遵循agentskills.io开放标准,与Claude Skills互通。技能创建流程包括发现问题、创建技能文件、加载使用和优化更新四个阶段。系统提供技能检索和自维护机制(Curator),支持技能媒体路由和多种管理命令。内置技能涵盖开发调试、创意头脑风暴等场景,通过积累技能使Hermes更适应用户需求。

程序猿_三产 732

记一次通过java多线程sql执行优化

多线程处理sql

阿文的专栏 1564

读懂 SAP Fiori Administration Catalogs:从管理员入口、权限编排到 Spaces 和 Pages 的落地实践

SAP Fiori 管理员目录的核心价值在于为系统配置提供标准化入口,解决权限与展示分离的问题。随着 SAP_UI 7.55 版本更新,SAP_FLP_ADMIN 角色整合了关键管理工具(如 Launchpad Designer、Content Manager),并通过 Business Catalog 和 Space 的协同作用,确保管理员既能访问配置工具,又能直观查看相关功能入口。项目实施中需注意配置层级(系统级/客户端级)的选择,以及多人协作时的数据同步问题,以提升交付效率。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 196

JAVASE面试宝典

JAVASE面试宝典

m0_73738217的博客 345

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【JavaSE】【多线程】进程与线程的概念

线程与进程概念讲解,及Java中创建一个线程

yj20040627的博客 3341

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

JavaSE(多线程和线程池)知识点总结

​ 线程就是操作系统能够进行运算调度的最小单位,它被包含在进程(进程是程序的基本执行实体,任务管理器种选择的进程就可以看到每个软件的进程)中,是进程中实际运作的单位。​ 比如:360杀毒软件,包括木马查杀、电脑清理、系统修复功能。其中360杀毒软件就是进程,其中的功能就是线程。​ 简单理解:应用软件种相互独立,可以同时运行的功能就是线程。

weixin_46119796的博客 1745

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

JAVASE:多线程

1.什么是多线程?有了多线程,我们就可以让程序同时做多件事情2.多线程的作用?提高效率3.多线程的应用场景?只要你想让多个事情同时运行就需要用到多线程比如:软件中的耗时操作、所有的聊天软件、所有的服务器器。

跟着豪哥学Java 2392

JavaSE——多线程

首先要弄明白一点,不等于操作系统级别的线程,Java创建的线程是Java虚拟机管理的,是。提供了统一的API,屏蔽了不同操作系统的差异性。操作系统级别的线程是由操作系统内核直接管理和调度的实体。它们是 CPU 调度的基本单位。现代 JVM 实现中,,即所谓的。ThreadC语言创建的线程,才是真正意义上的操作系统上的线程。但是C语言在类Unix使用pThread来创建线程,但是在Windows使用的是Win32 API。所以。

weixin_69032308的博客 1072

JavaSE 总复习:语法到多线程全梳理

JavaSE 高效复习指南(150字摘要) 本文提出结构化复习JavaSE的方法,强调从问题解决角度切入而非死记API。将JavaSE划分为12个核心模块,每个模块明确其解决的问题:基础语法构建代码基础,面向对象组织代码结构,集合管理数据,IO处理文件读写,多线程实现并发等。复习重点包括:掌握最小实现代码、识别常见错误、设计自测方案。特别提醒关注面向对象、集合、IO和多线程等核心模块,同时注意JDK版本差异。文章采用"问题导向+代码实践"的方式串联知识点,并提供详细笔记链接供深入查阅。 (150字)

一个持续进化的java+ai学习者博客:AI Agent 工具链(Codex、Harness、Claude Code、MCP、Skills)实战笔记 + 后端开发教程,每周稳定更新。 4906

JavaSE-多线程

这里写自定义目录标题学习主题:JavaSE-多线程学习前言:线程实现:线程的状态: 多线程 学习主题:JavaSE-多线程 多线程的本质就是多条路径同时执行 学习前言: 1.一条路径 程序按顺序执行,线程安全,但是CPU利用率低 2.两条路径 即为多线程,可以并行执行,但是存在线程不安全问题 3.进程 线程是操作系统的运行调度最小单位,是进程的运行单位 a:一个进程可以有多个线程 b:一个进程中的线程共享相同的内存单元 4.线程的优缺点 a:资源利用率高,程序响应快,程序设计存在便利 b:设计复杂(复

weixin_44158590的博客 465

【JavaSE】多线程

Java中的多线程的使用

低调做人,低调编码,神码都是浮云 1018

JavaSE超详细笔记-多线程篇-基于黑马

假如计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才可以执行指令。抢占式调度模型:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些。他的作用就是去调用main方法,并执行里面的代码,之前在main方法里的代码,其实都是运行在main线程当中。接下来,以线程基础,线程优先级,守护线程,礼让线程,插入线程的几个角度去拆分。

超级苦力怕的博客 1255

JavaSE多线程笔记

javase多线程笔记

cc_1113的博客 916

Javase学习复习D16[多线程]

主线程 : CPU和内存之间开辟的转门为main方法服务的线程指的是两个或者两个以上的线程在执行的过程中由于竞争同步锁而产生的一种阻塞现象;如果没有外力的作用,他们将无法继续执行下去,这种情况称之为死锁根据上图所示:线程1正在持有锁1,但是线程1必须再拿到锁2,才能继续执行而线程2正在持有锁2,但是线程2需要再拿到锁1,才能继续执行此时两个线程处于互相等待的状态,就是死锁,在程序中的死锁将出现在同步代码块的嵌套中当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。

ysy1648067239的博客 1049

JavaSE多线程之线程种类

JavaSE多线程之线程种类 1.线程控制之休眠线程 A:线程休眠: public static void sleep(long millis) 线程休眠 B:案例演示: 线程休眠 2.线程控制之加入线程 A:加入线程: public final void join() 意思就是: 等待该线程执行完毕了以后,其他线程才能再次执行 注意事项: 在线程启动之后,在调用方法 B:案例演示: 加入线程 ![在这里插入图片描述](https://img-blog.csdnimg.cn/202006050746

ITzhazhassc的博客 192

Javase | 多线程

多线程: 1.程序 2.进程 3.线程 4.多线程 5.自定义线程类 : 5.1 继承Thread类 5.2 实现Runnable接口 6.多线程的生命周期及状态转换 新建状态 (New) 就绪状态 (Runnable) 运行状态 (Running) 阻塞状态 (Blocked) 死亡状态 (Terminated) 7.多线程的调度 线程的优先级 线程的休眠 线程的让步 yield() 和 sleep() 的区别 8.多线程同步和通信 8.1 多线程的同步 8.2 多线程通信 .....

m0_70720417的博客 1691
上一篇: Mybatis(2)-本地缓存(一级缓存)的使用和原理
下一篇: JavaSE-多线程(2)- 锁
sql2008help
博客等级 码龄11年 80粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值