一、线程的各个状态

  图中的线程状态(Thread.Stat 中定义的Enum 名)NEW、RUNNABLE 、TERMINATED、WAITING、TIMED_WAITING 和BLOCKED 都能够通过Thread 类的getState 方法获取。

由图中可以看到:

1、sleep方法只有timed_waiting,是Thread的静态方法,可以通过Thread类名调用,也可以用线程对象调用,执行sleep方法不释放锁,只让出CPU等待,是给其他线程执行机会的最佳选择;

2、wait方法notify、notifyAll方法只能在加锁的代码synchronized(obj) 中使用,用被锁住的资源Object.wait()调用,wait()之后,释放对象锁,进入等待队列,被其他程序notify或者超时之后进入同步队列,去争夺锁。

3、I/O操作类似sleep,是不会释放锁

4、在线程thread2中调用thread1.join()方法,则thread2线程会等待thread1线程执行完毕后才会继续执行,等待过程不会释放锁。(可参考下文代码)

5、obj.notify()唤醒在此对象等待队列上等待的单个线程,选择是任意性的。notifyAll()唤醒在此对象等待队列上等待的所有线程

6、Thread.yield(),当前线程调用此方法,当前线程放弃获取的CPU时间片,但不释放锁资源,由运行状态立即变为就绪状态,让OS再次选择线程。作用:让相同优先级的线程轮流执行,但并不保证一定会轮流执行。实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。

 1 public class join_sync {
2 public static void main(String[] args) {
3 Object oo = new Object();
4 MyThread1 t1 = new MyThread1("线程t1--");
5 MyThread2 t2 = new MyThread2("线程t2--", oo,t1);
6 MyThread3 t3 = new MyThread3("线程t3--",oo);
7 t2.start(); //t2先启动获得锁
8 t3.start(); //t3刚启动时不会获得锁,因为锁被t2占有,t2中执行到join()时,t2先等待t1执行,但是此时没有释放锁
9 t1.start(); //t2中执行到join()时,t2先等待t1执行结束,t2继续执行
10 }
11 }
12
13 class MyThread1 extends Thread{
14 private String name;
15 public MyThread1(String name){
16 this.name = name;
17 }
18 @Override
19 public void run() {
20 for(int i = 0; i < 20; i++){
21 System.out.println(name + i);
22 }
23 }
24 }
25
26 class MyThread2 extends Thread{
27 private String name;
28 private Object oo;
29 public Thread threadd;
30 public MyThread2(String name,Object oo,Thread threadd){
31 this.name = name;
32 this.oo = oo;
33 this.threadd = threadd;
34 }
35 @Override
36 public void run() {
37 synchronized (oo) {
38 for(int i = 0; i < 20; i++){
39 System.out.println(name + i);
40 if(i==10) {
41 try {
42 threadd.join();
43 } catch (InterruptedException e) {
44 e.printStackTrace();
45 }
46 }
47 }
48 }
49 }
50 }
51
52 class MyThread3 extends Thread{
53 private String name;
54 private Object oo;
55 public MyThread3(String name,Object oo){
56 this.name = name;
57 this.oo = oo;
58 }
59 @Override
60 public void run() {
61 synchronized (oo) {
62 for(int i = 0; i < 20; i++){
63 System.out.println(name + i);
64 }
65 }
66 }
67 }
线程t1--0
线程t2--0
线程t1--1
线程t2--1
线程t1--2
线程t2--2
线程t1--3
线程t2--3
线程t1--4
线程t2--4
线程t1--5
线程t2--5
线程t1--6
线程t2--6
线程t1--7
线程t2--7
线程t1--8
线程t2--8
线程t1--9
线程t2--9
线程t1--10
线程t2--10
线程t1--11
线程t1--12
线程t1--13
线程t1--14
线程t1--15
线程t1--16
线程t1--17
线程t1--18
线程t1--19
线程t2--11
线程t2--12
线程t2--13
线程t2--14
线程t2--15
线程t2--16
线程t2--17
线程t2--18
线程t2--19
线程t3--0
线程t3--1
线程t3--2
线程t3--3
线程t3--4
线程t3--5
线程t3--6
线程t3--7
线程t3--8
线程t3--9
线程t3--10
线程t3--11
线程t3--12
线程t3--13
线程t3--14
线程t3--15
线程t3--16
线程t3--17
线程t3--18
线程t3--19

参考文献:https://blog.csdn.net/pange1991/article/details/53860651

java 多线程的状态迁移 常用线程方法分析的更多相关文章

  1. “全栈2019”Java多线程第五章:线程睡眠sleep()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  2. Java 多线程基础(六)线程等待与唤醒

    Java 多线程基础(六)线程等待与唤醒 遇到这样一个场景,当某线程里面的逻辑需要等待异步处理结果返回后才能继续执行.或者说想要把一个异步的操作封装成一个同步的过程.这里就用到了线程等待唤醒机制. 一 ...

  3. Java 多线程基础(七)线程休眠 sleep

    Java 多线程基础(七)线程休眠 sleep 一.线程休眠 sleep sleep() 方法定义在Thread.java中,是 static 修饰的静态方法.sleep() 的作用是让当前线程休眠, ...

  4. Java 多线程基础(八)线程让步

    Java 多线程基础(八)线程让步 yield 一.yield 介绍 yield()的作用是让步.它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权:但是,并 ...

  5. Java 多线程基础(九)join() 方法

    Java 多线程基础(九)join 方法 一.join() 方法介绍 join() 定义 Thread 类中的,作用是:把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.如:线 ...

  6. Java多线程基础:进程和线程之由来

    转载: Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够 ...

  7. Java多线程学习(八)线程池与Executor 框架

    目录 历史优质文章推荐: 目录: 一 使用线程池的好处 二 Executor 框架 2.1 简介 2.2 Executor 框架结构(主要由三大部分组成) 2.3 Executor 框架的使用示意图 ...

  8. “全栈2019”Java多线程第十一章:线程优先级详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  9. “全栈2019”Java多线程第九章:判断线程是否存活isAlive()详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

随机推荐

  1. C#与dotNET项目想要另存为一个新项目sln文件丢了怎么办

    如下图所示,我想要另存一个工程,把 V4.4整个的项目另存为V4.5,我可以把解决方案文件(.sln)改名字,但是我没法把文件夹改名字,改了打开sln就说找不到. 很简单的一个思路是反正sln是多余的 ...

  2. MAC VMware fusion 12.1.0 Centos7 网络配置

    虚拟机选择NAT模式 获取mac机器中vmnet8的gateway地址 找到 # NAT gateway address这一行,下面的ip就是gateway地址 cat /Library/Prefer ...

  3. 如何将rabbitmq集群中的某个节点移除.

    首先将要移除的节点停机. root@rabbitmq-03:~# rabbitmqctl stop Stopping and halting node 'rabbit@rabbitmq-03' ... ...

  4. [atARC113F]Social Distance

    (由于是实数范围,端点足够小,因此区间都使用中括号,且符号取等号) 定义$P(X)$表示$\forall 2\le i\le n,a_{i}-a_{i-1}\ge X$的概率,那么我们所求的也就是$P ...

  5. [loj3339]美食家

    令$f[i][j]$表示第$i$个时刻走到点$j$的最小时间,暴力的$dp$复杂度为$o(tm)$ 如果没有限制,由于$w\le 5$,记录前5个时刻的状态即可求出当前状态,用矩阵乘法可优化到$o(n ...

  6. go程序不停机重启

    让我们给http服务写一个版本更新接口,让它自动更新版本并重启服务吧. 初步例子 注:为了精简,文中代码都去除了err处理 main.go var Version = "1.0" ...

  7. 既生瑜何生亮 access_token VS refresh_token

    中国有句老话, 既生瑜何生亮, 既然有我周瑜在世, 为什么老天还要一个诸葛亮啊? 同样的, 众所周知, 在 OAuth 2.0 授权协议中, 也有两个令牌 token , 分别是 access_tok ...

  8. Flink 是如何统一批流引擎的

    关注公众号:大数据技术派,回复"资料",领取1000G资料. 本文首发于我的个人博客:Flink 是如何统一批流引擎的 2015 年,Flink 的作者就写了 Apache Fli ...

  9. python网络自动化运维之环境搭建(EVE-NG+pycharm)

    参考了很多资料,发现现在很多环境用的都是GNS3加linux下的python,几乎没有是用EVE-NG加上pycharm的教程,EVE的功能如此强大,存在的教程却较少,这里我出一篇教程供使用EVE作为 ...

  10. 实践案例1-利用低代码开发平台Odoo快速构建律师事务所管理系统

    今年10月份中旬的时候,有一段时间没联系的中学同学,我跟他关系比较好,突然打电话给我,希望我给他夫人的律所开发一个小系统.记得十几年前,当他还在他叔叔公司上班的,他是负责销售的,我们几乎每周都碰面,那 ...