Java Thread

Java多线程基础-4:详解Thread类及其基本用法 万字详解Java多线程编程类Thread及其基本用法。 阅读详情

Java多线程

Java多线程只有一种构造方式,即创建Thread对象。
实现线程的执行方法有两种方式:
1. 继承Thread,重写Thread的run()方法。
2. 实现Runnable 接口的run()方法。

线程命名

默认命名

Java源码

public Thread(Runnable target) {
    init(null, target, "Thread-" + nextThreadNum(), 0);
}
private static synchronized int nextThreadNum() {
    return threadInitNumber++;
}

如果没有为线程指定一个名字,线程将会以”Thread-“作为前缀与一个自增的数字结合。
在线程start之前,你可以通过Thread.setName(String name)改动线程的名字,一旦线程启动,名字将不可再被修改。

线程的父子关系

  1. 一个线程的创建肯定是由另外一个线程完成的。
  2. 被创建的线程的父线程是创建它的线程。

Threadh和ThreadGroup

构造一个线程时,如果没有显式地指定ThreadGroup,那么它将会和父线程同属于一个ThreadGroup。

Java 1.8内存改动

Java1.8相对于1.7把GC扩展到了方法区。方法区之前也称为持久代,但是Java8之后,为了GC而把持久代改动为元空间。元空间不属于jvm内存的一部分,它直接存在于本机内存中,而常量池移到堆中。

Java 能创建的线程数目和内存堆栈的关系

Java内存大小=堆大小 + 线程数目*栈大小。所以线程数目和内存堆栈为反比关系。虚拟栈内存的线程是私有的,也就是说每一个线程都会占有指定大小的内存。
比如32位的Windows最大内存是2G。

使用TimeUnit替代Thread.sleep

在JDK1.5之后引入了TimeUnit,并且对sleep进行了很好的封装。

TimeUnit.SECONDS.sleep(17);
TimeUnit.HOURS.sleep(17);
TimeUnit.DAYS.sleep(17);
TimeUnit.MILLISECONDS.sleep(88);

Thread.yield

Thread.yield()方法属于一种启发式的方法,其会提醒调度器我愿意放弃当前的CPU资源,如果CPU资源不紧张,则会忽略这种提醒。

设置线程的优先级

public final void setPriority(int newPriority)//为线程设定优先级
public final int getPriority()//获取线程的优先级

设置线程的优先级只是一个hint操作,具体如下:
1. 对与root用户,它会hint操作系统你想要设置的优先级别,否则它会被忽略。
2. 如果CPU比较忙,设置优先级可能会获得更多的CPU时间片,但是闲暇时间优先级的高低几乎不会有如何作用。
不要企图在程序设计中企图使用线程优先级绑定某些特定的业务,或者让业务严重依赖于线程优先级。

public final static int MIN_PRIORITY = 1;
public final static int MAX_PRIORITY = 10;
public final void setPriority(int newPriority) {
    ThreadGroup g;
    checkAccess();
    if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {
        throw new IllegalArgumentException();
    }
    if((g = getThreadGroup()) != null) {
        if (newPriority > g.getMaxPriority()) {
            newPriority = g.getMaxPriority();
        }
        setPriority0(priority = newPriority);
    }
}

如果指定优先级大于group的优先级,那么group的优先级会替换掉指定的优先级。
线程默认的优先级和父类的保持一致,一般情况下都是5。

获取线程的ID

public long getId() 获取线程的唯一ID,线程ID在整个JVM中都是唯一的。
获取当前线程Thread.currentThread()

线程interrupt(中断)

interrupt

public void interrupt()
public static boolean interrupted()
public boolean isInterrupted()
很多办法可以使当前的线程进入阻塞状态,比如:Object.wait(),Object.wait(long), Object.wait(long, int),Thread.sleep(long),Thread.sleep(long,int),Thread.join(), Thread.join(long), Thread.join(long, int), InterruptibleChannel的IO操作,Selector的wakeup方法, etc;,而调用当前线程的interrupt方法,就可以打断阻塞。虽然打断阻塞,都是并不意味着该线程的生命周期结束。
一旦一个线程在阻塞时被打断,则会跑出一个InterruptException的异常。

isInterrupted与Interrupted

Thread.isInterrupted()判断当前线程是否可以打断。
注意:如果InterruptedException被捕获,interrupt标识会被重置为false。
Thread.interrupted(),调用这个方法返回interrupt标识之后会直接檫除掉线程的interrupt(默认false)。

线程join方法详解

public final void join() throws InterruptedException
public final synchronized void join(long millis, int nanos) throws InterruptedException
public final synchronized void join(long millis) throws InterruptedException
join某个线程A,会使当前线程B进入等待状态(BLOCKED),知道线程A生命周期结束或者到达给定的时间。

public static void main(String[] args) {
        List<Thread> threads = IntStream.range(1,3).mapToObj(ThreadJoin::create).collect(Collectors.toList());

        threads.forEach(Thread::start);

        for (Thread thread : threads) {
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"#"+i);
            shortSleep();
        }
    }

    private static Thread create(int req) {
        return new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName()+"#"+i);
                shortSleep();
            }
        }, String.valueOf(req));
    }

    private static void shortSleep() {
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

关闭线程

正常关闭

线程结束生命周期正常结束

捕获中断信号关闭线程

使用volatile开关控制

异常退出

进程假死

【java】Thread.Sleep 与 Thread.onSpinWait 1.概述 转载:【java】Thread.Sleep 与 Thread.onSpinWait 2.Thread.Sleep 一般情况下,我们让线程等待一段时间都是使用Thread.sleep()命令。比如下面这个demo示例: @Test public void test9() throws InterruptedException { new Thread(() -> { System.out.println(Thread.currentThread().getName() 阅读详情

相关推荐

【Java】java Thread 源码

然后猛然发现自己已经经常用的东西,源码都没看过。线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。

九师兄 329

Java中Thread详解(一篇就够了)

前言 操作系统中,一个进程往往代表着一个应用程序实例,而线程是进程中轻量级的调度单元,也可以看作是轻量级的进程,可以共享进程资源。下面简单介绍在操作系统中线程通用实现方式。接下来内容主要对线程模型进行简单介绍,然后对Java线程实现Thread类进行了解。 线程模型 暂且抛开Java线程,先说明一下在操作系统中,线程通用的几种实现方式。实现线程主要有三种方式。 内核线程模型 使用内核线程实现的方......

starsray的博客 3万+

Java的Thread之join

 t.join();表示当前线程停止执行直到t线程运行完毕;t.join(1000); 表示当前线程等待t线程运行1000后执行;/* * Test.java * * Created on 2008年2月25日, 上午9:57 * * To change this template, choose Tools | Template Manager * and open the temp

马如林的IT博客 1万+

Java中的Thread类

线程

qq_774952435的博客 1万+

Open Interpreter利用Code Interpreter实现本地化

作为一个可以在本地环境中运行的工具,Open Interpreter可以访问互联网,没有文件大小和运行时间的限制,并且可以利用任何包或库。去年7月,OpenAI发布了一个强大的插件,名为Code Interpreter(代码解释器),它可以根据用户的自然语言需求生成并执行代码解决方案,帮助完成各种任务,如数据分析、图表创建和文件编辑等。Open Interpreter不仅是一个编码解释器,它还是一个强大的工具,专注于处理复杂任务,将GPT-4代码解释器的强大功能与本地开发环境的灵活性完美结合在一起。

DigitalChina_DCG的博客 1794

SARscape的DInSAR全流程-以西安市隋大兴唐长安城遗址为例

通过DInSAR对西安市隋大兴唐长安城遗址开展的年度周期性监测,发现成因是地质内部构造断裂带活动所导致的地面产生物理空间上的形变,而地面的沉降与抬升是直接影响城市发展与文化遗产保护最为常见的缓变型不可逆地质灾害。西安市地处汾渭断陷盆地中部,受临潼-长安断裂带影响,导致区域内构造活动较为强烈。由于早年西安市地表水资源匮乏,从上世纪50年代末开始大量开采地下水资源以满足城市人口不断扩张的需求,从而导致地下承压含水层水位急速下降,形成多个局部沉降中心(八里村、西工大、电子城等)。

2301_77687129的博客 5815

Java:Thread类及常见方法大全(画图+源码详解)

一、Thread 的常见构造方法 二、Thread 的几个常见属性 ·理解线程是否存活: ·理解前台线程与后台线程: 三、启动一个线程 四、中断一个线程 1、通过共享的标记来进行沟通 2、调用interrupt() 方法来通知 五、等待一个线程 六、获取当前线程的引用 七、休眠当前线程

linsc_05的博客 4667

手把手教你用闲置安卓手机搭建个人收款系统(蓝鲸支付私有化部署实战)

本文详细介绍了如何利用闲置安卓手机搭建个人收款系统,实现私有化支付部署。通过开源技术栈和容器化方案,零成本构建安全、高效的支付网关,解决传统支付平台的数据安全和资金风险问题。特别适合个人开发者和小微企业主,无需复杂审批,资金实时到账,显著降低运营成本。

weixin_30363285的博客 380

一篇文章让你学会Java之Thread类(线程)

线程(Thread)是程序执行的最小单位。一个Java程序默认至少有一个主线程,即main线程,负责执行main()方法。一个进程(Process)可以包含多个线程,多个线程可以共享进程中的资源(如内存、文件句柄等)。Java使用Thread类和Runnable接口来实现多线程编程。

Weiki的博客 2812

CANape快速上手

文章帮助记录CANape学习过程。

小弱鸡的博客 1万+

Lane、PHY和Preset Value Bit

每个Lane支持不同的传输速度和带宽,例如PCIe 3.0中,一个Lane的传输速度可以达到8 GT/s(Giga Transfers per second),也就是1 GB/s(GigaBytes per second)。Preset Value Bit(预置值位)是在PCIe 3.0的Lane上新引入的一种机制,用于优化信号传输质量。PCIe设备可以包含多个Lane,例如x1、x4、x8、x16等,表示该设备同时使用的Lane数目,比如x16表示该设备采用了16个Lane,具有更高的传输速度和带宽。

weixin_58083606的博客 1296

JAVA线程之Thread类详解

ss

MC的博客 9万+

芒果YOLOv8改进52:主干Backbone篇之GhostNetV2:提出原创GhostNetV2 架构升级版:引入长距离注意力机制增强廉价操作,构建更强端侧轻量型骨干,打造高效轻量级检测器

长距离注意力机制增强廉价操作,打造轻量级检测器

包括YOLOv5、YOLOv7、YOLOv8等模型改进 1611

java的thread类_thread 类详解

java.lang.Thread类详解一、前言位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知识:线程的几种状态、上下文切换,然后接着介绍Thread类中的方法的具体使用。二、线程的状态在正式学习Thread类中的具体方法之前,我们先来了解一下线程有哪些状态,这个将会有助于后面...

weixin_34352565的博客 7863

新能源汽车动力总成研发测试技术全景深度报告(2025版)

本文所有企业案例数据均来自上市公司财报、工信部备案信息及权威媒体报道,技术参数经第三方检测报告交叉验证。研发测试人员能力矩阵重构(T型人才进阶路径)[10] 全球动力总成市场2035年预测报告。[9] NI电动汽车HIL测试架构技术文档。[3] 东风汽车智能化研发体系深度报告。[5] 混合动力测功机发明专利技术细节。[1] 领克动力总成试验中心技术解析。[7] 新能源汽车产业迭代趋势白皮书。测试架构师-数字工程。测试架构师-安全合规。测试架构师-人工智能。

优快云-新能源汽车研发测试专业博主 777

把 SM30 用顺:从表设计到权限与传输,全面掌握 SAP Table Maintenance Generator

摘要 SAP的Table Maintenance Generator(TMG)是为配置表维护需求设计的经典工具,能够生成标准化的维护对话框(SM30)。它支持单表、维护视图(多表关联)和视图簇(导航式维护)三种维护对象类型。使用TMG前需注意三个关键设置:1)表维护权限选项;2)交付类(决定数据传输行为);3)客户端字段配置。通过SE54/SE11生成维护对话框时,需选择维护类型(一步/两步)和记录例程(控制传输)。TMG生成的对象包含函数组、屏幕和处理模块,但部分标准框架不可修改。实际应用中,可通过参数事

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

Java thread 怎么用_Java Thread 的使用

写俄罗斯方块游戏的时候用线程遇到一点问题。如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。实现Runnable接口比继承Thread类所具有的优势:1):适合多个相同的程序代码的线程去处理同一个资源2):可以避免java中的单继承的限制3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立(附)start 和 run 方法解释:1...

weixin_34632164的博客 645

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java thread target_Java Thread基础知识

Java Thread基础知识java程序中只有一种途径去启动一个线程,即调用Thread类的start()方法。java中的线程状态在Thread类中有一个内部的枚举类State描述了线程的各个状态。public enum State {/*** 线程创建但未启动时会处于此状态*/NEW,/*** 线程调用start方法,java虚拟机会启动一个线程,被认为是RUNNABLE状态,* 但此时可能...

weixin_30959723的博客 412

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JAVA-Thread 类的基本用法

在现代计算机编程领域,线程作为实现并发和并行计算的关键概念,广泛应用于各类应用程序开发中。无论是提升软件响应速度、优化资源利用,还是实现复杂的任务调度,线程都扮演着举足轻重的角色。一、线程是什么?线程是操作系统进行运算调度的基本单位,也被称作轻量级进程,它是进程中的实际运作单元。一个进程可以容纳多个线程,这些线程共享进程的内存地址空间以及其他资源,比如已打开的文件、信号量等。每个线程都具备独立的执行路径,拥有各自的堆栈、程序计数器和局部变量,能够依照自身的顺序去执行任务。

2301_77880989的博客 2033

java new thread()_(一)java多线程之Thread

Thread类学习java线程的开发者,首先遇到的第一个类就是Thread,通过使用Thread类,我们就可以启动,停止,中断一个线程. 在同一个时间片里, 可能会有多个线程在执行, 每个线程都拥有它自己的方法调用堆栈, 参数和变量.每个app至少会有一个线程--主线程(main thread).创建一个线程java创建线程有两种方式创建一个继承Thread的子类,并实现run方法使用Thread...

weixin_39619478的博客 6764

Java面试必备:Java 中 Thread.sleep() 和 Thread.yield() 的区别

在多线程编程中,线程调度是一个核心概念。Java 提供了多种方法来控制线程的行为,其中 `Thread.sleep()` 和 `Thread.yield()` 是两个常用的静态方法。虽然它们都涉及线程调度,但它们的用途和行为有显著差异。本文将深入探讨这两个方法的区别,并通过流程图帮助理解它们的工作机制。

qq_58299462的博客 1347

java 之 Thread

1.简介 一个进程可以有多个线程,例如打开一个手机app就是开了一个进程,在这个进程中可以使用多个线程; 线程就像是代码执行的路线,多线程就是多条代码可同时执行;例如百度搜索肯定是多线程的,不然只能一个人访问;在例如服务器的后台被客户端访问,肯定也是多线程处理客户端的请求的;迅雷下载也是多线程的;jvm也是多线程的,main线程和gc线程; 当然也有单线程的,例如:android的更新UI是......

z_x_Qiang的博客 1137

thread java_Java 源码阅读-Thread.java

现代企业讲究高并发,Java.lang.Thread值得好好研究一下。从源码里面可以看出Thread实际上是实现了Runable接口。public class Thread implements Runnable {1、说说Thread.sleep方法sleep是native方法,线程调用sleep方法,会放弃cpu的占用,但是不会放弃对锁资源的占有。/*** Causes the current...

weixin_34920577的博客 128

java thread destory_Java Thread destroy()方法

Thread类的destroy()方法用于销毁线程组及其所有子组。 线程组必须为空,表示线程组中的所有线程都已停止。语法public void destroy()异常IllegalThreadStateException :如果线程组不为空或者线程组已被销毁,则抛出此异常。SecurityException :如果当前线程无法修改此线程组。示例public class JavaDestroyExp...

weixin_36329071的博客 540

java 停止thread_java中Thread的停止

在对线程进行停止的使用,我们使用Thread类来进行操作,这里停止的状态分为三种:sleep、join和yield。它们都是使当前的线程停下来,不过在中断时有所区别。下面我们就java中Thread类的三种停止模式,分别带来概念和代码示例的讲解,一起看看都有哪些停止状态吧。1.sleepsleep()使当前线程进入停滞状态(阻塞当前线程),让出CPU的使用,以留一定时间给其他线程执行sleep休眠...

weixin_33023513的博客 866

java thread总结_Java Thread 总结

引用自http://www.cnblogs.com/DreamSea/archive/2012/01/11/JavaThread.html,作者 DreamSea530线程的概述(Introduction)线程是一个程序的多个执行路径,执行调度的单位,依托于进程存在。 线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间也叫做线程栈,是在建立线程时由系统分配的,主要用来保存...

weixin_32866779的博客 106
上一篇: Java线程的6种状态及切换(透彻讲解)
下一篇: Java Thread synchronized
袁小黑
博客等级 码龄15年 57粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值