Java线程状态转换关系实例解析
状态1:新建一个线程并且开启start()方法,使Java线程和操作系统线程联系起来;
状态2:Running——Waiting :调用wait方法
synchronized(lock){ lock.wait(); //进入waiting状态,释放锁 } synchronized(lock){ lock.notifyAll(); //,唤醒所有线程,使所有在waiting状态的线程进入blocked状态,进入entry List队列和其他线程一起竞争锁 }
状态3Running——Waiting:调用join()方法 join()方法最终调用的也是wait方法,它使用了保护性暂停机制:当两个线程之间有关系时,比如一个线程需要等待另外一个线程的结果,t.join()所有其他的线程都必须等待t线程执行完了才能执行
public final void join() throws InterruptedException { join(0); } public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { throw new IllegalArgumentException("timeout value is negative");//判断是否超时 } if (millis == 0) { while (isAlive()) { //判断线程是否活着,如果 wait(0); } } else { while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } }
park(t) unpark(t) 可以指定需要唤醒的线程,每一个线程都有一个parker对象 包含counter mutex 当线程调用 大致是下面这个意思
park(t){ if(t.ounter == 0) t.wait; else if (t.counter == 1) counter = 0; } unpark(t){ if(t.counter == 1) } e;se if(t.counter == 0){ t.counter = 0; 唤醒t线程 }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
相关推荐
-
学习Java多线程之线程定义、状态和属性
一 .线程和进程 1. 什么是线程和进程的区别: 线程是指程序在执行过程中,能够执行程序代码的一个执行单元.在java语言中,线程有四种状态:运行 .就绪.挂起和结束. 进程是指一段正在执行的程序.而线程有事也被成为轻量级的进程,他得程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内功空间(代码段.数据段和堆空间)及一些进程级的资源(例如打开的文件),但是各个线程都拥有自己的棧空间. 2. 为何要使用多进程 在操作系统级别上来看主要有以下几个方面: - 使用多线程可以减少程序
-
Java线程状态及切换、关闭线程的正确姿势分享
前言 在讲线程之前有必要讨论一下进程的定义:进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位.进程实体由程序段, 数据段 PCB(进程控制块)组成.线程又是什么?线程可以看做轻量级进程,线程是进程的执行单元,是进程调度的基本单位 本文将详细介绍关于Java线程状态及切换.关闭线程的相关内容,下面话不多说了,来一起看看详细的介绍吧 1.线程状态及切换 Java中的线程有六种状态,使用线程Thread内的枚举类来实现,如下,我对每个状态都进行了一定的解释. public
-
Java多线程状态及方法实例解析
这篇文章主要介绍了Java多线程状态及方法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 首先介绍线程的五种状态: 新生态:New Thread() 就绪态:准备抢CPU时间片 运行态:抢到了CPU时间片 阻塞态:放弃已经抢到的CPU时间片,且暂时不参与争抢 死亡态:Run运行完了之后 接下来介绍三种方法:线程的阻塞,线程的优先级设置,线程的礼让 public class MutliThreadDemo4 { public static
-
Java实现监控多个线程状态的简单实例
实例如下: import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; import java.util.concurrent.Executors; /** * 测试监控类 * * @author * */ public class WatchThread { /** * 测试函数 * * @throws InterruptedException */ public void testThre
-
Java检测线程中断状态的方法示例
本文实例讲述了Java检测线程中断状态的方法.分享给大家供大家参考,具体如下: 一 代码 public class InterruptCheck { public static void main( String[] args ) throws Exception { // sleepThread不停尝试睡眠 Thread sleepThread = new Thread(new SleepRunner(), "SleepThread"); sleepThread.setDaemon(
-
总结Java中线程的状态及多线程的实现方式
线程的状态 线程状态图: 说明: 线程共包括以下5种状态. 1. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread(). 2. 就绪状态(Runnable): 也被称为"可执行状态".线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程.例如,thread.start().处于就绪状态的线程,随时可能被CPU调度执行. 3. 运行状态(Running) : 线程获取CPU权限进行执行.需要注意
-
Java 线程状态和等待唤醒机制和线程池的实现
1.概念 线程一共有6中状态,相互之间可以互相转换. 等待唤醒案例(线程之间的通信) 实现: 等待唤醒案例:线程之间的通信 创建一个顾客线程(消费者):告知老板要的包子的种类和数量,调用wait方法,放弃cpu的执行,进入到WAITING状态(无限等待) 创建一个老板线程(生产者):花了5秒做包子,做好包子之后,调用notify方法,唤醒顾客吃包子 注意: 顾客和老板线程必须使用同步代码块包裹起来,保证等待和唤醒只能有一个在执行 同步使用的锁对象必须保证唯一 只有锁对象才能调用wait和noti
-
基于java 线程的几种状态(详解)
线程可以有六种状态: 1.New(新创建) 2.Runnable(可运行)(运行) 3.Blocked(被阻塞) 4.Waiting(等待) 5.Timed waiting(计时等待) 6.Terminated(被终止) 新创建线程: 当用new操作符创建一个新线程时,如new Thread(r),该线程还没有开始运行,它的当前状态为new,在线程运行之前还有一些基础工作要做. 可运行线程: 一旦线程调用start方法,线程处于runnable状态.在这个状态下的线程可能正在运行也可能没有运行(
-
Java线程池运行状态监控实现解析
在实际开发过程中,在线程池使用过程中可能会遇到各方面的故障,如线程池阻塞,无法提交新任务等. 如果你想监控某一个线程池的执行状态,线程池执行类 ThreadPoolExecutor 也给出了相关的 API, 能实时获取线程池的当前活动线程数.正在排队中的线程数.已经执行完成的线程数.总线程数等. 总线程数 = 排队线程数 + 活动线程数 + 执行完成的线程数. 线程池使用示例: private static ExecutorService es = new ThreadPoolExecutor(
-
Java线程状态转换关系实例解析
状态1:新建一个线程并且开启start()方法,使Java线程和操作系统线程联系起来: 状态2:Running--Waiting :调用wait方法 synchronized(lock){ lock.wait(); //进入waiting状态,释放锁 } synchronized(lock){ lock.notifyAll(); //,唤醒所有线程,使所有在waiting状态的线程进入blocked状态,进入entry List队列和其他线程一起竞争锁 } 状态3Running--Waiting
-
浅谈java线程状态与线程安全解析
目录 1.线程的几种状态 1.1 线程的状态 1.2 线程状态的转移 2.有关线程安全问题 2.1 一个简单的例子 2.2 造成线程不安全的原因 1.线程的几种状态 1.1 线程的状态 以下就是我们线程所有的状态和意义: NEW 已经创建Thread但未创建线程 RUNNABLE 可工作的. 又可以分成正在工作中和即将开始工作 BLOCKED 等待锁(阻塞状态) WAITING 调用wati方法(阻塞状态) TIMED_WAITING 调用sleep方法(阻塞状态) TERMINATED 系统线
-
Java线程状态运行原理解析
这篇文章主要介绍了Java线程状态运行原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码实例如下 package com.fgy.demo05; /** * 等待唤醒案例:线程之间通信 * 注意: * 同步使用的锁对象必须唯一 * 只有锁对象才能调用wait和notify()/notifyAll()方法 */ public class Demo1WaitAndNotify { public static void main(Strin
-
Java中finally和return的关系实例解析
本文研究的主要是Java中finally和return的关系,具体介绍和实例如下所示. finally 和 return 关系的总结 1.try块中有System.exit(0)这样的语句,由于它是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到. 2.其它情况下,finally语句都必然会被执行.因此可以在这里执行一些资源的释放操作. (1)finally中的return会覆盖try/catch中的renturn. (2)在finally中写re
-
Java线程Dump分析工具jstack解析及使用场景
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种方式: jstack [-l][F] pid 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题.另外,jstack工具还可以附属到正在运行的j
-
java new一个对象的过程实例解析
这篇文章主要介绍了java new一个对象的过程实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载.加载并初始化类完成后,再进行对象的创建工作. 我们先假设是第一次使用该类,这样的话new一个对象就可以分为两个过程:加载并初始化类和创建对象. 一.类加载过程(第一次使用该类) java是使用双亲委派模型来进行类的加载的,所以在
-
Java等待唤醒机制原理实例解析
这篇文章主要介绍了Java等待唤醒机制原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 线程的状态 首先了解一下什么是线程的状态,线程状态就是当线程被创建(new),并且启动(start)后,它不是一启动就进入了执行状态(run),也不是一直都处于执行状态. 这里说一下Java 的Thread类里面有一个State方法,这个方法里面涵盖了6种线程的状态,如下: public enum State { // 尚未启动的线程的线程状态.
随机推荐
- 查看驱动器(盘符)的批处理
- Java数据库连接池的几种配置方法(以MySQL数据库为例)
- IOS 开发之读取addressbook的实现实例
- iOS添加购物车动画效果示例
- ASP.NET Global.asax应用程序文件简介
- javascript实现完美拖拽效果
- CMD命令行下修改网络IP设置的方法
- 多列复合索引的使用 绕过微软sql server的一个缺陷
- MySQL实时监控工具orztop的使用介绍
- 为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能
- JS排序之选择排序详解
- 浅析java修饰符访问权限(动力节点Java学院整理)
- C#常用知识点简单回顾(有图有真相)
- C#使用smtp发送带附件的邮件实现方法
- PHP如何实现订单的延时处理详解
- Python3转换html到pdf的不同解决方案
- Linux文件和文件夹权限操作方法
- C语言简单实现门禁系统
- Python实现对特定列表进行从小到大排序操作示例
- pycharm下查看python的变量类型和变量内容的方法