线程概念:现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作系统就会创建一个Java进程。现代操作系统调度的最小单元是线程,也叫轻量级进程(LightWeight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行。

   一.线程状态

  1. NEW : 没有start的线程
  2. RUNNING :可运行线程,可能正在执行,也可能正在等待操作系统中的其他资源,比如cpu时间片
  3. BlOCKED:受阻塞并且正在等待监视器锁(monitor lock)的线程状态
  4. WAITING :一个正在无限期等待另一个线程执行一个特别的动作的线程处于这一状态
  5. TIMED_WAITING:一个正在限时等待另一个线程执行一个动作的线程处于这一状态
  6. TERMINATED:已经退出的线程

    二.状态分析

  1. NEW:new Thread()后,没有调用start()方法前
  2. RUNNING :线程正常运行中,但是也不是 每个时间片段都在执行,cpu分配给当前线程的时间片内执行
  3. BlOCKED:等待获取监视器锁以期进入同步代码块/方法,如进入synchronized方法,被阻塞
  4. WAITING:不带超时值的Object.wait方法被调用  ||  不带超时值的Thread.join方法被调用  ||  不带超时值的LockSupport.park方法被调用
  5. TIME_WAITING:Thread.sleep 方法被调用  ||  带有超时值的Object.wait 被调用  || 带有超时值的Thread.join 被调用 ||  LockSupport.parkNanos 被调用 || LockSupport.parkUntil 被调用
  6. TERMINATED:线程结束

LockSupport类处于sun包下面,里面的方法都是调用Unsafe类(操作内存空间),一般情况下不会手动调用

Java线程状态变迁图

     三.常见方法

join()   很多情况,主线程创建并启动子线程,如果子线程中需要进行大量的耗时计算,主线程往往早于子线程结束。这时,如果主线程想等待子线程执行结束之后再结束,比如子线程处理一个数据,主线程要取得这个数据,就要用join() 方法

yield()  线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是单纯的让给其他线程

interrupt()  标记线程中断

1. 线程调用sleep,wait,join等方法,并抛出一个InterruptedException。

2. 线程处于Running状态,只是线程的interrupt标记被设置为true,线程本身的运行不会受到任何影响

interrupt()  ,   isInterrupted()  ,  interrupted()   三者的区别

public class InterruptDemo {
public static void main(String[] args) {
Thread.currentThread().interrupt();//中断标识
System.out.println(Thread.currentThread().isInterrupted());//判断中断标识 返回结果true
System.out.println(Thread.interrupted());//返回当前中断状态,重置中断标识 返回结果true
System.out.println(Thread.currentThread().isInterrupted());//判断中断标识 返回结果false
}
}

wait()和notify(),notifyAll()配套使用:   wait()释放锁,等待唤醒    notify() 唤醒一个线程    notifyAll() 唤醒全部线程

      使用jps+jstack工具查看线程状态:  jstack + 进程ID

测试代码

public class ThreadStatusDemo {
public static void main(String[] args) {
Object lock1 = new Object();//lock
Object lock2 = new Object();//lock new Thread(() -> {//RUNNABLE 状态
synchronized (lock1) {
while (true) { }
}
}, "status-thread-1").start(); new Thread(() -> {//TIME_WAITING 状态
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "status-thread-2").start(); new Thread(() -> {//BLOCKED 状态
synchronized (lock1) { }
}, "status-thread-3").start(); new Thread(() -> {//WAITING 状态
try {
synchronized (lock2) {
lock2.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "status-thread-4").start(); }
}

初识java线程(Thread)的更多相关文章

  1. Java线程Thread的状态解析以及状态转换分析 多线程中篇(七)

    线程与操作系统中线程(进程)的概念同根同源,尽管千差万别. 操作系统中有状态以及状态的切换,Java线程中照样也有. State 在Thread类中有内部类 枚举State,用于抽象描述Java线程的 ...

  2. java 线程 Thread 使用介绍,包含wait(),notifyAll() 等函数使用介绍

    (原创,转载请说明出处!谢谢--http://www.cnblogs.com/linguanh/) 此文目的为了帮助大家较全面.通俗地了解线程 Thread 相关基础知识! 目录: --线程的创建: ...

  3. java 线程Thread 技术--volatile关键字

    java 语言中允许线程访问共享变量,为了保证共享变量能被准确和一致的更新,Java 语言提供了volatile 关键字,也就是我们所说的内存一致性: 问题抛出:(尝试去运行下面代码,以及将volat ...

  4. java 线程Thread 技术--1.5 Future与Callable

    Callable: 从官方文档说起: 通过实现callable 的called 方法可以使一个任务可以返回一个结果以及可能抛出一个异常: callable 与runnable 是相似的,可以被其他线程 ...

  5. java 线程Thread 技术--1.5 Executor Executors,ThreadPool,Queue

    Executors : Executors ,就是一个线程工具类:大部分操作线程的方法,都可以在这个工具类中就行创建,执行,调用一些线程的方法: Executor : 用于执行和提交一个runnabl ...

  6. java 线程Thread 技术--1.5Lock 与condition 演示生产者与消费模式

    在jdk 1.5 后,Java 引入了lock 锁来替代synchronized ,在使用中,lock锁的使用更加灵活,提供了灵活的 api ,不像传统的synchronized ,一旦进入synch ...

  7. java 线程Thread 技术--方法演示生产与消费模式

    利用wait 与notifyAll 方法进行演示生产与消费的模式的演示,我们两个线程负责生产,两个线程消费,只有生产了才能消费: 在effective Java 中有说过: 1. 在Java 中 ,使 ...

  8. java 线程Thread 技术--线程状态与同步问题

    线程技术第三篇: 线程的状态: 1. 创建状态: 当用new 操作符创建一个新的线程对象时,该线程就处于创建状态,系统不为它分配资源 2.可运行状态:当线程调用start 方法将为线程分配必须的系统资 ...

  9. java 线程Thread 技术--线程创建源码解释

    永远不要忘记最基础的东西,只有把最基础的知识打牢靠,才能够使你走的更远,我将从今天开始,进行线程知识的回顾,一些常用知识点,以及java1.5 引入的并发库,进行详细的讲解与总结 创建线程的目的是为了 ...

随机推荐

  1. Linux学习之路(二)文件处理命令之下

    分区格式化: 一块分区想要使用的话,要格式化.格式化主要有两个工作,1,把分区分成等大小的数据块,每个数据块一般为4KB.2在分区之前建一个分区表,给第一个文件建一行相关数据,在分区表里保存了它的io ...

  2. cad定制快捷键

    1.工具-自定义-编辑程序参数,改好之后,关闭. 2.在命令行输入:reinit-选择PGP文件-确定.

  3. html 转字符串换成代码

    1. [文件] htmlToCode.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  4. HTML5响应式模版Mocha

    HTML5响应式模版Mocha,经典,html5,蓝色,扁平,HTML5响应式模版Mocha是一款宽屏大气的HTML5网站展示模板. http://www.huiyi8.com/moban/

  5. Gym - 101341I:Matrix God(随机算法)

    题意:给出N,以及三个矩阵A,B,C,大小都为N*N.问是否满足A*B=C: N<1000: 思路:由于矩阵乘法的复杂度为O(N^3):而部分验证又不能保证结果正确.我们巧妙地利用矩阵乘法的结合 ...

  6. Money Systems

    链接 分析:来看看背包九讲里面的一段话: 对于一个给定了背包容量.物品费用.物品间相互关系(分组.依赖等) 的背包问题,除了再给定每个物品的价值后求可得到的最大价值外,还可以得 到装满背包或将背包装至 ...

  7. codevs 2144 砝码称重2

    传送门 2144 砝码称重 2  时间限制: 1 s  空间限制: 16000 KB  题目等级 : 钻石 Diamond 题解   题目描述 Description 有n个砝码,现在要称一个质量为m ...

  8. Merge into使用详解( 同时执行inserts和updates操作 )

    Merge是一个非常有用的功能,类似于MySQL里的insert into on duplicate key. Oracle在9i引入了merge命令, 通过这个merge你能够在一个SQL语句中对一 ...

  9. python--面向对象(最全讲解)

    http://www.cnblogs.com/Eva-J/articles/7293890.html 阅读目录 楔子 面向过程vs面向对象 初识面向对象 类的相关知识 对象的相关知识 对象之间的交互 ...

  10. deprecated conversion from string constant to ‘char*’

    deprecated conversion from string constant to ‘char*’ #include <iostream> using namespace std; ...