【JAVA】常见的几种线程运行机制 及 特殊线程 ——线程让步、线程加入(线程合并)、线程的优先级、中断线程、守护线程(精灵线程)

【C++11多线程】多线程之数据共享 本节课的主要内容是解决线程中数据共享的问题提示:以下是本篇文章正文内容,下面案例可供参考数据共享的定义:在多个线程中读/写一个变量。那我们首先要知道:变量能同时读取一个数据但不能同时写和读或者一起写同一个数据。数据我们可以定义为全局变量或类中的一个成员。... 阅读详情

Thread.yeild()

 Thread.yeild()是线程让步,即让当前处于运行状态的线程回到就绪状态,将剩余的时间让出来。

 但是,在线程运行机制里,没有哪一个方法能精确执行某项操作,只能是模糊执行。

package edu.xalead;

class TH1 extends Thread {

    *这里我们要知道的是,线程本身是有名字的。
    *是从Thread类里面继承下来的。
    *所以我们就不用在写名字了,虚拟机会默认分配一个名字。
    
    TH1() {

        this.setName( "让步线程" );
    }

    @Override
    public void run() {
        while (true) {
            Thread.yield();
            System.out.println( this.getName() );

        }
    }
}

class TH2 implements Runnable {
    
    *由于Runnable接口里面只有一个run()方法,
    *所以,这里输出里面直接填this.getName()会报错。
    *这里,我们可以用线程里头的Thread.currentThread().getName(),
    *这是得到当前正在运行的线程的接口的实现类里头的属性的。
    
    @Override
    public void run() {
        while (true) {
            System.out.println( Thread.currentThread().getName() );
            Thread.yield();
        }
    }
}

public class 让步 {
    public static void main(String[] args) {
        TH1 t = new TH1();
        t.start();
        TH2 th = new TH2();
        
        *TH2因为没有Thread类,就没有Run方法。
        *我们就可以用将节口的规范传到创建的Thread对象里头去,
        *取实现Runnable()方法。
        
        Thread t1 = new Thread(th);
        t1.start();
    }
}

 

Thread.jion()

Thread.jion()称为线程加入,是让要加入运行行列的线程先运行。而之前启动该线程的线程,则退出运行状态,处于阻塞状态。与Thread.sleep()的区别就是,Thread.sleep()阻塞的是该线程自己,Thread.jion()阻塞的是启动该线程的线程。且jion()方法将t线程加入到了启动这个线程的线程里头了, 这样,这两个线程就合并成了一个单线程。 所以,jion()又叫线程合并。 且主线程得要等t线程执行完才能执行

package edu.xalead;

class TTT1 implements Runnable {
    @Override
    public void run() {
        while (true) {
            System.out.println( Thread.currentThread().getName() );
        }
    }
}

public class 加入 {
    public static void main(String[] args) throws InterruptedException {
//        new Thread( new TTT1() ).start();
//        或者
//        Thread t=new Thread( new TTT1() );
//        t.start();

        //这里主线程和子线程是交替执行的。
        //交替时间大体各占50%

        Thread t = new Thread( new TTT1() );
        t.start();
        t.join();
//        jion()方法将t线程加入到了启动这个线程的线程理由了,
//        这样,这两个线程就合并成了一个单线程。
//        所以,jion()又叫线程合并。
//        且主线程得要等t线程执行完才能执行。

        while (true) {
            System.out.println( Thread.currentThread().getName() );
        }
    }
}

 

线程的优先级

           级别                                                   级数

1、最大优先级: t1.setPriority( Thread.MAX_PRIORITY );     (10)
2、最小优先级: t2.setPriority( Thread.MIN_PRIORITY );     (1)
3、普通优先级: t3.setPriority( Thread.NORM_PRIORITY );    (5)

这里,对线程的优先级,我们做的是对执行时间的分配的调整。这在之前,三个线程是平均分配执行时间的。

且优先级要在程序执行之前设置,不然不管用。

package edu.xalead;

class TS implements Runnable{
    @Override
    public void run(){
        while(true){
            System.out.println(Thread.currentThread().getName());
        }
    }
}

public class 线程的优先级 {
    public static void main(String[] args) {
        Thread t1=new Thread( new TS(),"A" );
        Thread t2=new Thread( new TS(),"B" );
        Thread t3=new Thread( new TS(),"C");
        //优先级要在程序执行之前设置。
        t1.setPriority( Thread.MAX_PRIORITY );
        t2.setPriority( Thread.MIN_PRIORITY );
        t3.setPriority( Thread.NORM_PRIORITY );
        t1.start();
        t2.start();
        t3.start();
    }
}

 

t.setDaemon( true)

t.setDaemon(true)叫作守护线程,又叫精灵线程。同样,守护线程的设置也应该在程序启动之前设置,才起作用。这里,守护线程是无线循环执行的。且守护线程如果是由主线程启动的,当主线程执行完了,守护线程也就执行结束了。也就是说,只要是哪个线程启动守护线程的,守护线程就等待哪个线程的执行。

如果不是主线程启动的,只要主线程一结束,尽管守护线程守护的不是主线程,但是守护线程也就结束了。

守护线程往往是给主线程扫除障碍的,比如服务器的面临可能会崩溃的情况,守护线程会替主线程监视服务器的运行情况。

package edu.xalead;

class TSS implements Runnable {
    /**
     * 普通线程
     */
    @Override
    public void run() {
        Thread t2 = new Thread( new TSS(), "aaa" );
        t2.start();
        System.out.println( Thread.currentThread().getName() );
    }
}

public class 守护线程 {
    public static void main(String[] args) {
        /**
         * 守护线程无线循环执行
         */
        Thread t1 = new Thread( new TSS() );
        t1.setDaemon( true );//设置守护线程
        //主线程执行,守护线程就会开始执行。
        t1.start();


        /**
         * 主线程有限循环执行
         */
        for (int i = 0; i < 1000; i++) {
            System.out.println( Thread.currentThread().getName() );
        }
    }
}

 

中断线程

t.interrupt()为中断线程,不过我们要注意的是。t.interrupt()只是改变状态,是在线程运行状态中进行操作的。而中断的操作是由

if(this.isInterrupted()){
    break;
}

和

while (System.currentTimeMillis() < tt + 10000) {
        t.interrupt();
}

来控制的。

拓展:

【二者有个共同的问题——有死锁倾向

t.suspend()  挂起,即把线程执行的时间让出处,一直等线程恢复的时候,在执行。

t.resume()  线程恢复

有断掉数据库连接的特性
t.stop()  会断掉数据库服务器连接,数据库服务器会保留这个连接。也就相当于打开了一个没有用的连接,对服务器的运行有很大的影响。】

package edu.xalead;

class TTTT extends Thread{
    public void run(){
        try {
            while(true){
                System.out.println(this.isInterrupted());

                /**
                 * 杀死线程的代码
                 */
                if(this.isInterrupted()){
                    break;
                }

                System.out.println(Thread.currentThread().getName());
                //Thread.sleep( 1000 );
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public class 中断线程 {
    public static void main(String[] args) {
        TTTT t = new TTTT();
        t.start();

        try {
            Thread.sleep( 10000 );
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
       
        long tt = System.currentTimeMillis();
        while (System.currentTimeMillis() < tt + 10000) {
                t.interrupt();
        }
    }
}

 

精灵线程(Daemon)或守护线程---马克-to-win java视频 立即下载

相关推荐

T100服务端接口实战:从注册到日志排查的全链路开发指南

本文提供了一份T100服务端接口开发的全链路实战指南。从程序注册与框架签出开始,详细讲解了接口的数据结构设计、核心业务逻辑编写,到最终的部署上线与调用验证。文章重点分享了如何利用日志文件高效定位和排查接口问题,帮助开发者快速掌握T100接口开发的关键步骤与实用技巧。

weixin_28831399的博客 300

Java线程(四):线程中断、线程让步、线程睡眠、线程合并

最近在Review线程专栏,修改了诸多之前描述不够严谨的地方,凡是带有Review标记的文章都是修改过了。本篇文章是插进来的,因为原来没有写,现在来看传统线程描述的不太完整,所以就补上了。理解了线程同步和线程通信之后,再来看本文的知识点就会简单的多了,本文是做为传统线程知识点的一个补充。有人会问:JDK5之后有了更完善的处理多线程问题的类(并发包),我们还需要去了解传统线程吗?答:需要。

寻道 4万+

Cesium实战:如何在前端直接渲染TIFF影像(附完整代码与避坑指南)

本文详细介绍了如何在前端利用Cesium直接加载和渲染TIFF影像的完整技术方案。针对TIFF格式的地理影像数据,文章提供了从文件解析、坐标转换到像素处理与Cesium集成的全流程代码实现,并分享了性能优化与常见问题的避坑指南,帮助开发者高效实现三维地理可视化。

weixin_29290947的博客 314

java多线程之精灵线程/守护线程(Daemon)

转自http://www.kongzid.com/archives/thread4 ,在java中,本身无法使虚拟主机保持活动的线程称为精灵线程Daemon,又称为守护线程,就是运行在程序后台的线程,一般被用于在后台为其它线程提供服务。既然它在后台运行,当前台线程(即主线程,又叫用户线程)运行完,主体程序就结束了,理所当然该后台线程也应该随之结束了。

孔子说 1086

从零到一:AIGC+Unity3D打造动态天空盒的实战指南

本文详细介绍了如何利用AIGC技术结合Unity3D打造动态天空盒的实战指南。通过AIGC生成360全景图,再集成到Unity3D中,实现高效、多样化的天空盒效果。文章涵盖了从AIGC全景图生成、工作流搭建到Unity场景集成的完整流程,并提供了代码示例和优化建议,帮助开发者快速掌握这一技术。

weixin_29021291的博客 603

PET,CT图像融合笔记

PET-CT怎样进行图像融合?图像融合实现CT与PET图像的融合 OpenCV实现(附实验结果)

chenran187906的博客 8409

java中线程的一些相关概念,第1篇(主线程、线程优先级、线程组、精灵线程(守护线程)、线程状态、线程同步、死锁、线程间的通信)

java中线程的一些相关概念 先了解一点线程相关的概念:主线程、线程优先级、线程组、精灵线程(守护线程)、线程状态、线程同步、死锁、线程间的通信(使用 wait()notify()notifyAll()进行线程间通信) 源码点这里 精灵线程又称为守护线程 接下来先介绍主线程和线程优先级 /** * 在java程序启动时,有一个线程立即执行,我们把该线程称为程序的主线程 ...

一只苟延残喘的卑微蝼蚁 505

Verilog简易电梯控制系统(2层)

电梯处于1楼,按KEY3,LED3亮,电梯处于上行状态时,立刻按 KEY2,LED2亮,电梯继续运行至2楼,LED3灭;按KEY3,LED3亮,电梯处于上行状态时,立刻按 KEY0,LED0亮,电梯继续运行至2楼,LED3灭;电梯处于2楼,按KEY2,LED2亮,电梯处于下行状态时,立刻按 KEY3,LED3亮,电梯继续运行至1楼,LED2灭;电梯处于2楼,按KEY2,LED2亮,电梯处于下行状态时,立刻按 KEY1,LED1亮,电梯继续运行至1楼,LED2灭;电梯运行至2楼后LED1灭,2楼待机。

m0_54240221的博客 6952

JAVA基础:线程优先级和精灵线程

线程存在的目的是为了提升代码的效率,以前的程序只有主线程自己执行是串行的,这样的代码效率低 ,多线程执行的代码是并行的,多个线程同时执行代码,这样的效率高,但是线程并不是越多越好,线程的执行需要获取CPU才能执行,而CPU的数量是有限的,并且java的线程还是抢占式的,这时就会出现一个问题,如果有一个线程要执行的代码是更重要的,我们需要让这个线程更早的执行,如果线程的优先级都一样就可能会导致这个线程一直抢不到CPU。

weixin_65346668的博客 630

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

clDice Loss是一种针对细长结构分割任务的拓扑保持损失函数,通过比较预测区域和真实区域的中心线重叠情况来评估分割质量。与传统Dice Loss关注区域重叠不同,clDice Loss重点考察连通性和骨架拓扑结构,能有效避免血管断裂、分支错误连接等问题。该损失函数包含两个核心指标:预测骨架在真实区域中的覆盖比例(Topology Precision)和真实骨架被预测区域覆盖的比例(Topology Sensitivity),通过调和平均得到最终评估值。由于传统骨架提取算法不可导,实际实现采用可微的so

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

电化学-NanoStat-开源系统的使用说明

本文主要介绍了NanoStat开源系统的使用方法,从硬件打板、设备组装、软件安装3个层次进行了详细说明。整个流程根据作者提供的视频能够很好的完成,不需要太多的技术,对刚入门的新手是一个不错的练手项目。其次软件还有很大的优化空间,能够进一步提高系统的精度,对之后类似恒电位仪系统的开发也有很大的借鉴意义。

分享技术笔记,希望对大家能够有一定的帮助,同时也通过归纳总结提升自己的个人能力。 2000

3 - 线程 - Windows 10 - Python - 守护线程 / 后台线程 / 精灵线程

目录守护线程 / 后台线程 / 精灵线程创建精灵线程的方法 守护线程 / 后台线程 / 精灵线程 首先讲解守护线程。 有一种线程,它是在后台运行的,它的任务是为其他线程提供服务,这种线程被称为“后台线程(Daemon Thread)”,又称为“守护线程”或“精灵线程”。Python 解释器的垃圾回收线程就是典型的后台线程。 后台线程有一个特征,如果所有的前台线程都死亡了,那么后台线程会自动死亡。 用 python 的 Threading 模块调用 Thread 对象的 daemon属性可以将指定线程设

Muxiu 1211

2019年高教社杯全国大学生数学建模竞赛 C 题:《机场的出租车问题》真题解析与 MATLAB 解决方案

🏆 本文已收录于专栏:《滚雪球学数学建模(含历年真题)》,持续更新最新及历年数学建模竞赛资料,每篇内容力求做到“问题讲透、模型讲清、代码可用、论文可参考”,帮助你从零开始逐步建立完整的数学建模知识体系。

**My Coding Family** 3453

java多线程入门(主线程、线程组、线程优先级、精灵线程/守护线程)

java多线程入门 源码点这里 接下来,我们讲一讲主线程、线程组、线程优先级、精灵线程/守护线程 在讲之前,我们先简要的说一说,什么是线程,进程,程序 等一下,我们直接po代码和截图,直接看具体的案例 多线程即在同一时间,可以做多件事情(说白了,就是齐头并进) 单线程就是按部就班 程序:一系列命令/指令的集合,说白了,就是一堆英文字母和数字组成的指令,这堆英文字母和数字需要符合编程语...

一只苟延残喘的卑微蝼蚁 1482

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

线程实例分析---线程的综合运用(精灵线程,多线程,中断,通信)【java养成】

Java学习打卡:第二十八天 内容导航Java学习打卡:第二十八天线程实例分析Q1:线程与精灵线程的运用题目内容:问题分析Q2:多线程与interrput的应用题目内容:Q3 模拟买票题目内容题目分析文件File Java养成计划(打卡第28天) 内容管理: 今天的分享主要是三道线程的题目,之后会再巩固一下File类 线程实例分析 Q1:线程与精灵线程的运用 题目内容: 创建一个包含实例变量i的线程。线程启动之后,首先创建并启动一个精灵线程,然后对变量i循环累加1,直到i的值等于Integer.MA

a23452的博客 784

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

线程与进程02

线程与进程: 1. 一个应用程序生成一个进程, 但一个进程可以产生多个线程 2. 进程间通信非常麻烦, 但线程非常方便,线程之间通信使用通知机制,可以进行通信 3. 进程独享资源, 线程共享它所属的进程的资源 4. 进程结束,则这个进程所产生的线程也会销毁 java中线程的处理方式 1. 继承Thread类(外部类,匿名内部类) class 子类名 extends Threa

B_TAEYANG的博客 510

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

特殊的多线程

还是因为项目的原因,我一直在想怎么解决之前遇到的问题,程序顺序执行却要求在中间延时执行某个函数,我不想用信号,最后咨询了朋友,他告诉我用多线程。我想了想, 我已经用了回调了,似乎也用不了回调了。就尝试下多线程吧。 下面是我自己总结的一个线程使用方法,线程可以无限次数的开启,因为是设置成了程序运行完成,或者意外发生,均会自动销毁线程。也许不是太安全,但是好用。 这里我放上一个函数的代码。 int touch_piano() { int x , y , cont = 0 ; int fd_ts

qq_37195486的博客 220

几种特殊的多线程函数

静态   如果同步函数被静态修饰后,使用的锁是什么呢? 通过验证,发现不是this 因为静态方法中不可以定义this 静态进内存时,内存中没有本类对象,但是一定有给类对应的字节码文件对象。 类名:class  该对象的类型时Class class Ticket implements Runnable { private int tick=100; public void r

l55iuming的专栏 550

JAVA学习篇--ThreadLocal,Java中特殊的线程绑定机制

在DRP项目中,我们使用了ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection向下传递(传递connection的目的是由于jdbc事务要求确保使用同一个connection连接)。那么ThreadLocal是如果做到的呢?它和同步锁的不同在哪里?   是什么:   对于ThreadLocal看英文单词我们很容易理解为一个线程的本地实现,但是它

何静媛 9622

java中精灵线程(Daemon)或守护线程和普通线程有什么区别

7.精灵线程(Daemon)或守护线程: 马克-to-win:Daemon英文意思是希腊神话中半人半神的精灵,守护神。在java中,"精灵守护Daemon线程"就是运行在程序后台的线程,一般被用于在后台为其它线程提供服务。既然它在后台运行,当前台线程(前几节学习的线程)运行完,主体程序就结束了,理所当然该后台线程也应该随之结束了。相对来讲,前面几节我们讲的线程是"用户线程",这两种线程技术上来...

mark_to_win的专栏 4422

守护线程保证主线程不断掉

1.主线程package com.project.cache; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.Date; import java.util.List; import java.util.concurrent.Calla...

Nightliar的博客 1390

如何理解线程的优先级?

1.特点? 1.线程的优先级为1-10,一般使用Thread的类常量,不会手动赋值 public static final int MIN_PRIORITY = 1;-----最低优先级 public static final int NORM_PRIORITY = 5;-----普通优先级 public static final int MAX_PRIORITY = 10;------最高优先级 2.在线程的优先级没有特殊指定时,默认都为普通优先级【NORM_PRIORITY = 5】; 3.thread

sjh10000的博客 2019

【线程】线程合并、线程优先级

线程合并 线程中join方法的意思是把指定的线程加入到当前线程,即将两个交替执行的线程合并为顺序执行的线程。比如在主线程B中,子线程A调用了join()方法,意思是说直到线程A执行完毕后,线程B才会继续执行。同理,如果子线程A调用了join(10)方法,意思是说等线程A执行10毫秒后,线程B才会继续执行; 合并线程是加入到启动线程的这个线程里,主线程等待加入线程执行完执行。 代码展示: pac...

云卷云舒 293

精灵(Daemon)线程的定义

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 621

线程操作方法join与interrupt,什么是精灵线程?synchronized的使用---线程互斥与临界【线程互斥】【java养成】

Java学习打卡:第二十六天 内容导航Java学习打卡:第二十六天内容管理join()interrput()所有的阻塞方法都可以中断吗精灵线程与程序终止daemon 与 user区别互斥与临界区 Java养成计划(打卡第26天) 内容管理 今天继续分享多线程的问题,主要看同步与互斥。 join() 这是Thread类的一个实例方法,当线程调用另外一个线程的join方法就可以让自己暂停运行,直至另外一个线程终止,该方法为当前线程提供了一种等待机制 interrput() 这是Thread中的一个实例方法,

a23452的博客 625
上一篇: 【JAVA】线程生命周期
下一篇: TCP/IP工作流程
寻爻青年
博客等级 码龄8年 27粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻爻青年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值