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 UED
Java中的多线程编程:从基础到实践
【10月更文挑战第13天】 Java作为一门跨平台的编程语言,其强大的多线程能力一直是其核心优势之一。本文将从最基础的概念讲起,逐步深入探讨Java多线程的实现方式及其应用场景,通过实例讲解帮助读者更好地理解和应用这一技术。
22 3
|
4天前
|
Java 开发者
在Java编程中,正确的命名规范不仅能提升代码的可读性和可维护性,还能有效避免命名冲突。
【10月更文挑战第13天】在Java编程中,正确的命名规范不仅能提升代码的可读性和可维护性,还能有效避免命名冲突。本文将带你深入了解Java命名规则,包括标识符的基本规则、变量和方法的命名方式、常量的命名习惯以及如何避免关键字冲突,通过实例解析,助你写出更规范、优雅的代码。
25 3
|
4天前
|
Java 程序员
在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。
【10月更文挑战第13天】在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。本文介绍了Java关键字的基本概念及其重要性,并通过定义类和对象、控制流程、访问修饰符等示例,展示了关键字的实际应用。掌握这些关键字,是成为优秀Java程序员的基础。
12 3
|
4天前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
15 3
|
3天前
|
存储 安全 Java
了解final关键字在Java并发编程领域的作用吗?
在Java并发编程中,`final`关键字不仅用于修饰变量、方法和类,还在多线程环境中确保对象状态的可见性和不变性。本文深入探讨了`final`关键字的作用,特别是其在final域重排序规则中的应用,以及如何防止对象的“部分创建”问题,确保线程安全。通过具体示例,文章详细解析了final域的写入和读取操作的重排序规则,以及这些规则在不同处理器上的实现差异。
了解final关键字在Java并发编程领域的作用吗?
|
2天前
|
缓存 算法 Java
Java 中线程和纤程Fiber的区别是什么?
【10月更文挑战第14天】
10 0
|
4月前
|
Java C++
关于《Java并发编程之线程池十八问》的补充内容
【6月更文挑战第6天】关于《Java并发编程之线程池十八问》的补充内容
48 5
|
1月前
|
缓存 监控 Java
Java中的并发编程:理解并应用线程池
在Java的并发编程中,线程池是提高应用程序性能的关键工具。本文将深入探讨如何有效利用线程池来管理资源、提升效率和简化代码结构。我们将从基础概念出发,逐步介绍线程池的配置、使用场景以及最佳实践,帮助开发者更好地掌握并发编程的核心技巧。
|
3月前
|
安全 Java 开发者
Java中的并发编程:深入理解线程池
在Java的并发编程中,线程池是管理资源和任务执行的核心。本文将揭示线程池的内部机制,探讨如何高效利用这一工具来优化程序的性能与响应速度。通过具体案例分析,我们将学习如何根据不同的应用场景选择合适的线程池类型及其参数配置,以及如何避免常见的并发陷阱。
52 1
|
3月前
|
监控 Java
Java并发编程:深入理解线程池
在Java并发编程领域,线程池是提升应用性能和资源管理效率的关键工具。本文将深入探讨线程池的工作原理、核心参数配置以及使用场景,通过具体案例展示如何有效利用线程池优化多线程应用的性能。