线程概念:现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个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. Machine Learning No.10: Anomaly detection

    1. Algorithm 2. evaluating an anomaly detection system 3. anomaly detection vs supervised learning 4 ...

  2. Android WiFi系统【转】

    本文转载自:http://blog.csdn.net/gabbzang/article/details/10584587 一.wpa_supplicant是什么? wpa_supplicant本是开源 ...

  3. hdu1015 —— 回溯

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1015 因为之前看了下刘汝佳的<算法入门经典>,就用类似打印全排列,八皇后的方法做.本以为不 ...

  4. vs2010 windows service 项目不能引用类库项目

    在一个windows 服务项目A中,引用了另外一个项目B,可以使用自动完成,引用其他项目中的类,按理,可以自动提示了,应该就是没问题了,但编译时却提示"未能找到类型或命名空间名称" ...

  5. h5打电话发短信写邮件怎么实现

    // 一.打电话<a href="tel:0755-10086">打电话给:0755-10086</a> // 二.发短信,winphone系统无效< ...

  6. laravel基础课程---7、文件处理、闪存、cookie(cookie原理和使用场景)

    laravel基础课程---7.文件处理.闪存.cookie(cookie原理和使用场景) 一.总结 一句话总结: 页面请求服务器的时候是把这个页面中所有的cookie都带上了的,cookie里面也存 ...

  7. codeforces 566D D. Restructuring Company(并查集)

    题目链接: D. Restructuring Company time limit per test 2 seconds memory limit per test 256 megabytes inp ...

  8. [acm]HDOJ 2064 汉诺塔III

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=2064 汉诺塔变种,只能从中间专业,递归关系为:f(n)=3*f(n-1)+2. //汉诺塔变种,只能 ...

  9. Scrapy,终端startproject,显示错误TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

    F:\python_project\test>scrapy startproject spz Traceback (most recent call last): File "d:\p ...

  10. bzoj3456城市规划 多项式取模

    題目大意 求出有n个点的有标号简单连通无向图的数目. 题解 什么破玩意,直接输出\(2^{C_n^2}\)走人 我们发现这张图要求连通,而上式肯定不能保证连通. 其实上式表示的是不保证连通的有标号简单 ...