【从面试题建立知识体系】JAVA面试题-----------并发编程------线程

线程是程序执行的最小单位,存在于进程中,多个线程可并行执行以提高程序效率。线程的状态包括初始、运行、阻塞、等待、超时等待和终止。创建线程可通过继承Thread类或实现Runnable接口,带返回值的线程则使用Callable和FutureTask。线程状态的转换反映了线程在不同条件下的行为。
摘要由CSDN通过智能技术生成

并发编程(一)------线程

什么是线程?

  • 程序(program):为完成特定任务,用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。
  • 进程(process):程序的一次执行过程,或者是正在运行的一个程序。是一个动态的过程:有它自身的产生,存在和消亡的过程。
  • 线程(thread):进程可进一步细化为线程,是一个程序内部的一条执行路径。
    • 若一个进程同一时间并行执行多个线程,就是支持多线程的
    • 线程是调度和执行的单位,每个线程拥有独立的运行栈和程序计数器(pc),线程切换的开销小

一个程序最少需要一个进程,而一个进程最少需要一个线程。所以线程是程序执行流的最小单位,而进程是系统进行资源分配和调度的一个单位。

一个线程就是在进程中的一个单一的顺序控制流
而耽搁进程可以拥有多个并发执行的任务,每个任务都好像有自己的CPU一样,而且底层的机制切分CPU的时间,也就是CPU将轮流给每个任务分配其占用时间。CPU的调度是抢占式的,当一个单核单线程的CPU执行多线程任务时,实际上同一时刻只会有一个线程在执行,其他线程在CPU执行当前线程时会被挂起等待,CPU执行当前线程一段时间后会将当前线程挂起然后由其他线程继续抢占。

每个任务都觉得自己一直在占用CPU,而实际上是将CPU时间划分成片段分配给所有的任务,在多个CPU的环境下,多线程的运作可以极大的提高程序的运行速度。这就是线程存在的意义。

创建线程的方式

  • 无返回值类型
  1. 继承Thread类创建线程
    1.1 定义Thread类的子类,并重写该类的run方法,该run方法体就代表了线程要完成的任务。因此把run()方法称为执行体。
    1.2 创建Thread子类实例,即创建了线程对象。
    1.3 调用线程对象的start()方法来启动该线程。

  2. 通过Runnable接口创建线程类
    2.1定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
    2.2 创建Runnable实现类的实例,并依次实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
    2.3 调用线程对象的start()方法来启动该线程。

  • 带返回值类型
  1. 通过Callable接口创建线程类
    1.1 创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。
  2. 通过FutureTask来创建线程类

线程的状态

1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。

2.运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)低啊用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。

3.阻塞(BLOCKED):表示线程阻塞于锁。

4.等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。

5.超时等待(TIMED_WAITING):改状态不同于WAITING,它可以在指定的时间后自行返回。

6.终止(TERMINATED):表示该线程已经执行完毕。

线程的状态图

在这里插入图片描述

线程状态详细说明

1.初始状态(NEW)

	实现Runable接口和继承Thread可以得到一个线程类,new一个实例出来,线程就进入了初始状态

2.1 就绪状态(RUNNABLE之READY)

 - 就绪状态只是说你有资格运行,调度程序没有挑选到你,你永远就是就绪状态。例如在未被分配到CPU时间片,线程池中等待等。
 - 调用线程的start()方法,此线程进入就绪状态
 - 当前线程sleep()方法结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入就绪状态。
 - 当前线程时间片用完了,调用当前线程的yield()方法,当前线程进入就绪状态。
 - 锁池里的线程拿到对象锁后,进入就绪状态。

2.2 运行中状态(RUNNABLE之RUNNING)

线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。
  1. 阻塞状态(BLOCKED)

    阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或者代码块(获取锁)时的状态。
    
  2. 等待(WAITING)

    处于这种状态的线程不会被分配CPU执行时间,它们要等待被显式的唤醒,否则会处于无限期等待的状态。
    
  3. 超时等待(TIMED_WAITING)

    处于这种状态的线程不会被分配CPU执行时间,不过无需无限期等待被其他线程显示的唤醒,在达到一定时间后它们会自动唤醒。
    
  4. 终止状态(TERMINATED)

    - 当线程的run()方法完成时,或者主线程的main()方法完成时,就认为它被终止了。这个线程对象也许是活的,但是它已经不是一个单独执行的线程。线程一旦终止了,就不能复生。
    - 在一个终止的线程上调用start()方法,会抛出java.lang.lllegalThreadStateException异常。
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值