【多线程-从零开始-贰】线程的构造方法和常见属性

简介: 【多线程-从零开始-贰】线程的构造方法和常见属性

Thread 的常见构造方法

  • 在创建线程的时候,是可以给线程起名字的。默认为 Thread-0 、Thread-1…
  • 不会影响线程执行效果,可以更好地进行管理
  • ThreadGroup-线程组
  • 把多个线程放到一组里,方便统一的设置线程的一些属性
  • 不过现在很少用到,线程相关属性用的也不太多,更多会用到“线程池”

Thread 的几个常见属性

  • 通常情况下,一个 thread 对象,就是对应到系统内部的一个线程(PCB),但也可能会存在一个情况——Thread 对象存在,但是系统内部的线程已经没了/还没创建
  • 设置不同的优先级会影响到系统的调度。这里的影响是基于“统计”规则的影响,直接肉眼观察,很难看到效果

前台线程:

[!NOTE] 后台线程/前台线程

  • 若某个线程在执行过程中,可以阻止进程结束,此时这个线程就是“前台线程
  • 若某个线程在执行过程中,不能阻止进程结束(虽然线程在执行着,但是进程要结束了,此时这个线程也会随之被带走)这样的线程就是“后台线程”,也叫做“守护线程
  • 一个进程中,前台线程可以有多个(创建线程的时候默认就是前台的),必须所有的前台线程都结束,进程才能结束

  • 前台线程就相当于是饭桌上的“老大”,若只有一个老大,他走了饭局就散了;若有很多老大,那得他们一起商量结不结束;后台线程就相当与是后台上的我,走不走无所谓,小透明
public class test3 {  
    public static void main(String[] args) {  
        System.out.println("hello main");  
        Thread t = new Thread(() -> {  
            while(true){  
                System.out.println("hello thread");  
                try{  
                    Thread.sleep(1000);  
                }catch (InterruptedException e){  
                    throw new RuntimeException(e);  
                }            
            }        
        });
          
        //将t线程设为后台进程,只要main进程结束,整个进程就结束了  
        t.setDaemon(true);  
        t.start();  
    }
}

把 t 进程设为后台进程后,程序中就只有 main 一个前台线程了,所以只要 main 执行完,整个进程就结束了

又因为线程是并发执行的,所以 t 线程中的执行逻辑可能赶在 main 线程执行前执行

所以最终打印结果一定有“hello main”,可能也有“hello thread

  • 前台进程和后台进程唯一的区别就是控制结束时间
  • 一个进程中必须得有一个前台线程


是否存活:

  • 代码中,创建的 newThread 对象的生命周期和内核中实际的线程是不一样的,可能会出现 Thread 对象仍然存在,但内核中的线程不存在了这种情况
  1. 调用 start 之前,内核中还没有创建线程
  2. 线程的 run 执行完毕了,内核的线程就没有了,但是 Thread 对象仍然存在
  • 不会出现 Thread 对象不存在,线程还存在的这种情况

isAlive()

  • 为 true,表示内核线程存在
  • 为 false,表示内核线程没了
public static void main(String[] args) throws InterruptedException {  
    Thread t = new Thread(() -> {  
        for(int i = 0; i < 3; i++) {  
            System.out.println("hello thread");  
            try {  
                Thread.sleep(1000);  
            } catch (InterruptedException e) {  
                throw new RuntimeException(e);  
            }        
        }    
    });  
    System.out.println(t.isAlive());  //false  
  
    t.start();  
    System.out.println(t.isAlive());  //true  
    
    Thread.sleep(5000);  
    System.out.println(t.isAlive());  //false  
}
  • 第一次打印 false:此时线程还未创建
  • 第二次打印 true:此时线程创建了,但还没结束
  • 第三次打印 false:由于 main 线程此时还在休眠,所以只考虑 t 线程,又因为 t 线程的 run 在五秒之内已经执行完了,所以线程就没有了

  • 由于线程之间的调度顺序是不确定的,如果两个线程都是 sleep(3000),此时,当时间一到,两个线程谁先执行,谁后执行是不一定的,所以打印出 true 还是 false 是不确定的
  • 但不一定不是指双方概率相等,双方概率会随着系统的不同,代码运行环境的不同而改变


相关文章
|
4月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
174 0
|
4月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
5月前
|
Java 数据挖掘 调度
Java 多线程创建零基础入门新手指南:从零开始全面学习多线程创建方法
本文从零基础角度出发,深入浅出地讲解Java多线程的创建方式。内容涵盖继承`Thread`类、实现`Runnable`接口、使用`Callable`和`Future`接口以及线程池的创建与管理等核心知识点。通过代码示例与应用场景分析,帮助读者理解每种方式的特点及适用场景,理论结合实践,轻松掌握Java多线程编程 essentials。
329 5
|
9月前
|
Python
python3多线程中使用线程睡眠
本文详细介绍了Python3多线程编程中使用线程睡眠的基本方法和应用场景。通过 `time.sleep()`函数,可以使线程暂停执行一段指定的时间,从而控制线程的执行节奏。通过实际示例演示了如何在多线程中使用线程睡眠来实现计数器和下载器功能。希望本文能帮助您更好地理解和应用Python多线程编程,提高程序的并发能力和执行效率。
311 20
|
9月前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
177 13
|
9月前
|
安全 Java C#
Unity多线程使用(线程池)
在C#中使用线程池需引用`System.Threading`。创建单个线程时,务必在Unity程序停止前关闭线程(如使用`Thread.Abort()`),否则可能导致崩溃。示例代码展示了如何创建和管理线程,确保在线程中执行任务并在主线程中处理结果。完整代码包括线程池队列、主线程检查及线程安全的操作队列管理,确保多线程操作的稳定性和安全性。
|
11月前
|
NoSQL Redis
单线程传奇Redis,为何引入多线程?
Redis 4.0 引入多线程支持,主要用于后台对象删除、处理阻塞命令和网络 I/O 等操作,以提高并发性和性能。尽管如此,Redis 仍保留单线程执行模型处理客户端请求,确保高效性和简单性。多线程仅用于优化后台任务,如异步删除过期对象和分担读写操作,从而提升整体性能。
182 1
|
12月前
|
数据采集 Java Python
爬取小说资源的Python实践:从单线程到多线程的效率飞跃
本文介绍了一种使用Python从笔趣阁网站爬取小说内容的方法,并通过引入多线程技术大幅提高了下载效率。文章首先概述了环境准备,包括所需安装的库,然后详细描述了爬虫程序的设计与实现过程,包括发送HTTP请求、解析HTML文档、提取章节链接及多线程下载等步骤。最后,强调了性能优化的重要性,并提醒读者遵守相关法律法规。
329 0
|
30天前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
118 6
|
4月前
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
284 83

热门文章

最新文章