线程概念:现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个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. PAT 甲级 1028. List Sorting (25) 【结构体排序】

    题目链接 https://www.patest.cn/contests/pat-a-practise/1028 思路 就按照 它的三种方式 设计 comp 函数 然后快排就好了 但是 如果用 c++ ...

  2. springcloud 研发规范

    1) 程序结构规范 1: Facade-Stub:包含所有对外提供服务的借口定义,并对外提供 2:  Façade:实现Façade-Stub里面定义的全部借口,可以调用Service模块和Commo ...

  3. git创建与管理远程分支【转】

    本文转载自:http://blog.chinaunix.net/uid-9398085-id-3164754.html git创建与管理远程分支 1.远程分支就是本地分支push到服务器上的时候产生的 ...

  4. glViewport()函数和glOrtho()函数的理解(转)

    转:http://www.cnblogs.com/yxnchinahlj/archive/2010/10/30/1865298.html 摘要:glOrtho相当指定图框的大小,由此会使得图框里的图形 ...

  5. HDU 4405 Aeroplane chess:期望dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4405 题意: 你在下简化版飞行棋... 棋盘为一个线段,长度为n. 上面有m对传送门,可以直接将你从a ...

  6. js(11)

    style对象的相关案例 <!DOCTYPE html> <html> <head> <title>MyHtml.html</title> ...

  7. kvm初体验之三:vm的安装及管理

    Host: CentOS release 6.4 (Final) Guest: CentOS release 6.6 (Final) 全程以root身份操作 1. host上创建桥br0 参考< ...

  8. 分享知识-快乐自己:spring_Boot 中文返回给浏览器乱码 解析成问号?? fastJson jackJson

    心路历程: 在Controller中return 对象的时候,对象中的属性值中文部分在浏览器中 显示为问号?? 然后结果是这样的:?? 尝试排查原因: 中文乱码常有以下三种: 1.request.re ...

  9. hdu 1002 A + B Problem II(大数)

    题意:就是求a+b (a,b都不超过1000位) 思路:用数组存储 第一道大数的题目,虽然很水,纪念一下! 代码: #include<cstdio> #include<cstring ...

  10. Ubuntu更改启动内存

    参考:https://superuser.com/questions/152921/how-to-boot-with-mem-1024m-argument-using-grub-ubuntu-10-0 ...