首页 > 其他分享 >多线程(概念)

多线程(概念)

时间:2022-12-18 10:46:15浏览次数:44  
标签:状态 就绪 执行 概念 线程 多线程 CPU

一 概述

是指从软件或者硬件上实现 多个线程 并发执行的技术
具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能

当数据量非常庞大的时候,为了提高效率,采用多线程,如高速收费站有多个,12306买票

二 并行和并发

并行:在同一时刻,有多个指令(程序)在多个CPU上同时执行
并发:在同一时刻,有多个指令(程序)在单个CPU上交替执行
高并发(让程序能够实现高并发)

三 进程和线程

1 进程:

是正在运行的程序
是系统进行资源分配和调用的独立单位
每一个进程都有它自己的内存空间和系统资源

2 线程:

是进程中的单个顺序控制流,是一条执行路径,是进程中执行运算的最小单元

关系:

单线程:一个进程如果只有一个线程则称为单线程程序
多线程:一个进程如果有多个线程则称为多线程程序

Java程序中,main方法就是主线程,一个程序只有一个主线程

四 线程的状态与生命周期

线程的一个完整的生命周期中,可能经历五种状态,且线程因不同条件会在不同状态之间转换。

1.New 新建状态

new Thread()建立一个线程对象后,该线程对象就处于新建状态。
处于新建状态的线程对象,只能够被启动或终止

2.Runnable 就绪状态

当线程对象调用start()方法之后,该线程就进入就绪状态,
并进入就绪队列排队等待CPU资源,即等待JVM里线程调度器的调度

3. Running 运行状态

如果就绪状态的线程获取CPU资源时(CPU开始调度处于就绪状态的线程时),就可以执行run()方法,此时线程处于运行状态。
run()方法定义了该线程的操作和功能(任务)

4.Blocked 阻塞状态

(1)阻塞状态不是最终状态
阻塞状态是线程因为某种原因让出CPU使用权,暂时停止运行。
在引起阻塞的原因没有取消前,即使CPU空闲,该线程也不会被执行。
当引起阻塞的原因被取消,线程重新转入就绪状态,再次等待cpu资源。

(2)阻塞的情况分三种:

  • 等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
    (wait会释放持有的锁)直到由其他线程执行notify()和notifyAll()方法通知它,该线程才能重写进入就绪队列
  • 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
  • 其他阻塞:运行的线程执行sleep()或join()方法,或者发出I/O请求时,JVM会把该线程置为阻塞状态。
    当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
    注意)sleep是不会释放持有的锁

5.dead 死忙状态

线程会以如下3种方式之一结束,结束后就处于死亡状态:

①run()方法执行完成,线程正常结束
②线程抛出一个未捕获的Exception或Error。
③直接调用该线程stop()方法来结束该线程——该方法容易导致死锁,通常不推荐使用

 

标签:状态,就绪,执行,概念,线程,多线程,CPU
From: https://www.cnblogs.com/Sco-/p/16990065.html

相关文章

  • 多线程的实现 *
    一继承Thread类实现步骤:定义一个类(MyThread)继承Thread类在MyThread类中重写run()方法创建MyThread类的对象启动线程(对象名.start();)1run()和start()方法的区别(1)......
  • Nacos配置中心基本概念及使用
    SpringCloudAlibaba从2018年开源以来,得到了众多软件爱好者的关注,尤其是在SpringCloudNetflix一些组件处于停更后。SpringCloudAlibaba提供了许多分布式环境下的重要......
  • Flink的概念、特点及运行原理
    Flink是一个针对流数据和批数据的分布式处理引擎,主要用Java代码实现。目前,Flink主要还是依靠开源社区的贡献来发展的。对于Flink,其处理的数据主要是流数据,批数据只是流......
  • Python之threading: 带你了解多线程的强大威力!
    前言什么是多线程多线程是指在一个程序中同时创建和使用多个执行流(thread)来执行不同的任务。这样多个任务就可以同时进行,从而提高程序的执行效率。在python使用多线......
  • python多线程修改共享全局变量不安全
    当需要对全局变量进行更改时,则会出现不安全的情况 #-*-coding:utf-8-*-"""================================================================================......
  • 第十四章《多线程》第8节:线程池
    系统启动一个线程的成本是比较高的,因为启动线程的操作要与操作系统交互。如果程序中需要创建大量生存期较短的线程,那么使用线程池将会大幅度提高程序的运行效率。线程池中保......
  • 第十四章《多线程》第9节:ThreadLocal类
    如果多个线程共用一个对象,那么这个对象的属性值对于这些线程都是相同的。例如有一个a对象,它有一个x属性,如果x属性的值是1,那么对于任何一个线程而言,a对象的x属性都是1。但有......
  • 第十四章《多线程》第7节:线程组
    多个线程可以组成一个线程组,线程组可以对一批线程统一调度和管理,也就是说,控制一个线程组相当于控制这个线程组中所有的线程。Java语言以ThreadGroup这个类来表示线程组这个......
  • 第十四章《多线程》第6节:线程通信
    之前所有的例子中,线程的执行都具有一定的随机性。如果希望线程能够有序的执行,必须使用线程通信技术。Java语言提供了一些线程通信的机制能够保证线程的有序执行,本小节将详细......
  • 第十四章《多线程》第4节:控制线程
    从14.3小节所列举的各个例子可以很明显的看出:线程的执行有一定的随机性,如果不加以适当控制,会导致执行结果的不确定性。实际开发过程中,很多情况下都需要让线程按照程序员期望......