Java并发编程基础-线程简介

简介: 章节目录1.线程定义2.使用多线程的优势3.线程优先级4.线程的状态5.Daemon 线程1.线程定义进程与线程的区别1.进程是cpu进行资源分配的独立单位,指的是程序在数据集合上的一次运行过程。

章节目录

  • 1.线程定义
  • 2.使用多线程的优势
  • 3.线程优先级
  • 4.线程的状态
  • 5.Daemon 线程

1.线程定义

进程与线程的区别

1.进程是cpu进行资源分配的独立单位,指的是程序在数据集合上的一次运行过程。
2.线程是cpu 进行调度的最小单位,在一个进程中会创建多个线程。

线程拥有的独立资源

栈中数据是线程独享的,包括局部变量、程序计数器等
堆中数据是线程共享的,如线程同时操作堆中某对象的某属性。

Java程序运行的实质

一个程序的运行不仅仅是main()方法的运行,而是main线程和多个其他线程共同运行

2.使用多线程的优势

1.充分利用更多的处理核心
2.更快的响应时间

   例如,一笔订单的创建,它包括插入订单数据,生成订单快照,发送邮件通
知买家和记录货品销售数量等, 用户从单击“订购按钮" 开始,就要等待这些操
作全部完成才能看到订购成功的结果,但是这么多的业务操作,如何才能够跟快的完成?
   在上面的场景中,我们可以使用多线程技术,即将数据一致性不强的操作派发
给其他线程处理,好处是响应用户请求的线程能更快的处理完成,缩短了响应时间,提升了用户体验。

3.线程优先级

thread.setPriority(10),线程优先级从1-10顺序排列

4.线程的状态

Java线程在运行的声明周期中可能处于如下表所示的6中状态,在给定的一个时刻,线程只能处于其中一个状态。

状态名称 说明
new 初始状态,线程被构建,但是还没有调用start()方法
runnable 运行状态,Java线程将操作系统中的就绪运行两种状态统称为"运行中"
block 阻塞状态,表示线程等待资源可用,如i/o 或者阻塞于锁
waiting 等待状态,表示线程进入等待状态,进入该状态表示当前线程需要等待其他线程做出一些特定动作(通知或中断)
time_waiting 超时等待状态,该状态不同于waiting,它是可以在指定的时间自行返回的
terminated 终止状态,表示当前线程执行完毕

如下图所示,为java线程状态变迁图:

img_e207e30e3532bbeea003a8ffbde88833.png
java线程状态变迁图

1.线程创建之后,调用start()方法,状态变更为可运行状态,待资源准备就绪后,开始运行。
2.线程执行 lockObject.wait() 方法,线程进入等待状态。
3.进入等待状态的线程依靠其他线程的通知才能返回到运行状态。
4.超时等待相当于在等待状态基础上增加超时限制,超时时间到达会自动返回到运行状态。
5.线程调用同步方法,在没有获取锁的情况下,线程会进入到阻塞状态。
6.线程在执行Runable 的run()方法后,进入终止状态。

Daemon线程
支持性线程,被用作程序中后台调度以及支持性工作。
当一个Java虚拟机中不存在非Daemon线程时,JVM将退出。
可以通过调用Thread.setDaemon(true)将线程设置为Daemon线程。
Daemon属性需要在启动线程前执行,不能在启动线程之后启动。

注意:Daemon线程被用作完成支持性工作,但在Java虚拟机退出时,Daemon线程中的finally不一定会执行。
如下代码所示:

public class Daemon {
  
    static class DaemonRunner implements Runnable {
        public void run(){
            try{
                TimeUnit.Second.sleep(10);//沉睡10s
            }finally{
                System.out.println("Daemon thread finally run");//执行类似资源回收动作
            }
        }   
    }
}

当JVM中已经没有非Daemon线程,虚拟机就要退出。JVM中所有Daemon线程需要立即终止,因此finally块并没有执行。

目录
相关文章
|
4天前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
26 6
【Java学习】多线程&JUC万字超详解
|
2天前
|
Java 开发者
【Java编程新纪元】JDK 22:超级构造函数来袭,super(...) 前导语句改写编程规则!
【9月更文挑战第6天】JDK 22的超级构造函数特性是Java编程语言发展史上的一个重要里程碑。它不仅简化了代码编写,还提升了代码的可读性和维护性。我们有理由相信,在未来的Java版本中,还将有更多令人兴奋的新特性等待我们去发现和应用。让我们共同期待Java编程新纪元的到来!
|
2天前
|
Oracle Java 关系型数据库
【颠覆性升级】JDK 22:超级构造器与区域锁,重塑Java编程的两大基石!
【9月更文挑战第6天】JDK 22的发布标志着Java编程语言在性能和灵活性方面迈出了重要的一步。超级构造器和区域锁这两大基石的引入,不仅简化了代码设计,提高了开发效率,还优化了垃圾收集器的性能,降低了应用延迟。这些改进不仅展示了Oracle在Java生态系统中的持续改进和创新精神,也为广大Java开发者提供了更多的可能性和便利。我们有理由相信,在未来的Java编程中,这些新特性将发挥越来越重要的作用,推动Java技术不断向前发展。
|
3天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
4天前
|
存储 Ubuntu Linux
C语言 多线程编程(1) 初识线程和条件变量
本文档详细介绍了多线程的概念、相关命令及线程的操作方法。首先解释了线程的定义及其与进程的关系,接着对比了线程与进程的区别。随后介绍了如何在 Linux 系统中使用 `pidstat`、`top` 和 `ps` 命令查看线程信息。文档还探讨了多进程和多线程模式各自的优缺点及适用场景,并详细讲解了如何使用 POSIX 线程库创建、退出、等待和取消线程。此外,还介绍了线程分离的概念和方法,并提供了多个示例代码帮助理解。最后,深入探讨了线程间的通讯机制、互斥锁和条件变量的使用,通过具体示例展示了如何实现生产者与消费者的同步模型。
|
5天前
|
存储 Java
Java编程中的对象序列化与反序列化
【9月更文挑战第2天】在Java的世界里,对象序列化和反序列化就像是给数据穿上了一件隐形的斗篷。它们让数据能够轻松地穿梭于不同的系统之间,无论是跨越网络还是存储在磁盘上。本文将揭开这层神秘的面纱,带你领略序列化和反序列化的魔法,并展示如何通过代码示例来施展这一魔法。
8 0
|
12天前
|
存储 监控 Java
Java多线程优化:提高线程池性能的技巧与实践
Java多线程优化:提高线程池性能的技巧与实践
38 1
|
12天前
|
监控 安全 Java
Java多线程调试技巧:如何定位和解决线程安全问题
Java多线程调试技巧:如何定位和解决线程安全问题
65 2
【多线程面试题 一】、 创建线程有哪几种方式?
创建线程的三种方式包括继承Thread类、实现Runnable接口和实现Callable接口,其中Runnable和Callable接口方式更受推荐,因为它们允许多重继承并更好地体现面向对象思想。
下一篇
DDNS