Java并发编程系列之一:Thread简介

开发 后端
线程是一个程序的多个执行路径,执行调度的单位,依托于进程存在。 线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间也叫做线程栈,是在建立线程时由系统分配的,主要用来保存线程内部所使用的数据,如线程执行函数中所定义的变量。

[[409711]]

线程的概述

线程是一个程序的多个执行路径,执行调度的单位,依托于进程存在。 线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间也叫做线程栈,是在建立线程时由系统分配的,主要用来保存线程内部所使用的数据,如线程执行函数中所定义的变量。

注意:Java中的多线程是一种抢占机制而不是分时机制。抢占机制指的是有多个线程处于可运行状态,但是一个CPU同时只允许一个线程在运行,他们通过竞争的方式抢占CPU。

线程的状态

NEW(新建状态):当一个线程的实例被创建即使用new关键字和Thread类或其子类创建一个线程对象后,此时该线程处于新生(new)状态,处于新生状态的线程有自己的内存空间,但该线程并没有运行,此时线程还不是活着的

RUNNABLE(就绪状态):当一个新建的线程执行Thread.start()以后,线程进入就绪状态。这个状态的线程已经做好了运行的准备工作,但是还没有真正执行run方法的代码。

RUNNING(运行中):当一个就绪状态的线程,被CPU选中,分配时间片开始执行,就进入到运行中状态。这个状态的线程已经在真正执行run方法。

BLOCKED(阻塞状态):一个运行中的线程,有两种情况会进入阻塞状态。一个是等待获取synchronized锁的时候;另外一个是一个获取到synchronized锁的线程调用Object.wait方法后被唤醒,会进入阻塞状态,因为它需要重新获取之前已经得到的锁。该状态下的线程,在取到锁以后,进入就绪状态。

WAITING(等待状态):一个运行中的线程,执行Object.wait()、Thread.join()、LockSupport.park()等方法就会进入等待状态。等待状态的线程,需要被其他线程唤醒(Object.notifyAll()、LockSupport.unpark()),唤醒以后进入就绪状态。

TIMED_WAITING(等待一定时间状态):一个运行中的线程,执行Thread.sleep(timeout)、Object.wait(timeout)、Thread.join(timeout)、LockSupport.parkNanos(timeout)、LockSupport.parkUntil(timeout)等方法进入到等待一定时间状态。这个状态的线程,在等待超时或者被其他线程唤醒后,进入到就绪状态。

TERMINATED(终止状态):一个线程执行完毕或者被异常中断以后进入该状态,该状态下isAlive方法返回false。

常用方法

  • start方法

start()用来启动一个线程,当调用start方法后,系统才会开启一个新的线程来执行用户定义的子任务,在这个过程中,会为相应的线程分配需要的资源。

  • run方法

run()方法是不需要用户来调用的,当通过start方法启动一个线程之后,当线程获得了CPU执行时间,便进入run方法体去执行具体的任务。

  • sleep方法

sleep相当于让线程睡眠,交出CPU,让CPU去执行其他的任务。需要注意的是,sleep方法不会释放锁,也就是说如果当前线程持有对某个对象的锁,在sleep生效期间,其他线程是无法获取该对象的synchronized锁。

  • yield方法

调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。它跟sleep方法类似,同样不会释放锁。但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。yield方法让线程从RUNNING状态回到RUNNABLE状态。

  • join方法

A线程执行B线程的join方法以后,A线程需要等B线程执行完成以后才能继续执行。从状态角度来讲,A线程在执行B线程的join方法以后,A线程进入到WAITING或者TIMED_WAITING状态,一直等到B线程进入到TERMINATED状态或者等待超时以后,A线程才会回到RUNNABLE状态。

  • wait方法

wait方法是Object类就实现的方法,线程执行该方法以后,进入到WAITING或者TIMED_WAITING状态,在被其他线程唤醒或者等待超时后,进入到RUNNABLE状态。需要注意的是,调用wait方法会释放已经获取到锁,等线程被唤醒以后会进入到BLOCKED状态。直到重新拿到锁以后,才会进入到RUNNABLE状态。

  • notify/notifyAll方法

notify/notifyAll方法也是Object类就实现的方法,执行该方法以后,可以唤醒等待队列里面一个/全部线程,让他们进入到RUNNABLE状态。 

 

责任编辑:武晓燕 来源: 今日头条
相关推荐

2016-09-26 17:09:28

Java并发编程内存模型

2012-09-24 14:03:58

C#网络协议C

2021-11-06 19:52:20

源码ReadThread

2022-02-28 14:54:48

openHarmon鸿蒙操作系统

2017-09-19 14:53:37

Java并发编程并发代码设计

2009-06-01 11:28:48

EquinoxOSGi入门

2010-06-17 15:43:50

UML创始人

2011-12-29 13:31:15

Java

2017-03-27 21:59:57

TDD开发编程

2021-05-19 07:13:16

Thread-Per-设计模式

2022-03-31 07:52:01

Java多线程并发

2019-01-10 08:33:17

物联网IoT机器

2018-04-12 21:31:31

物联网发展趋势互联网

2009-10-23 13:24:20

linux Shell

2023-06-30 08:27:20

2022-11-22 11:18:38

Java虚拟线程

2018-12-18 14:08:01

Java内存volatile

2011-10-11 10:39:24

2023-07-03 09:59:00

并发编程并发容器

2012-03-09 10:44:11

Java
点赞
收藏

51CTO技术栈公众号