前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >线程状态切换代码小记

线程状态切换代码小记

作者头像
小小明童鞋
发布2020-05-11 09:12:33
7400
发布2020-05-11 09:12:33
举报
文章被收录于专栏:java系列博客java系列博客

《java并发编程》那本书其实反复的看过很多遍了,也扒了很多多线程相关文章,但是不用的话很快就又忘记了 ,想到一个概念于是动手操作了一遍,以便加深认知。

  • 先看一下Thread类的源码中线程状态的枚举说明,共有六种线程状态。

` /** * A thread state. A thread can be in one of the following states: * <ul>

代码语言:javascript
复制
 * <li>{[@link](https://my.oschina.net/u/393) #NEW}<br>
 *     A thread that has not yet started is in this state.
      一个线程在创建对象后,以及调用start()之前,状态为new
 *     </li>
 
 * <li>{[@link](https://my.oschina.net/u/393) #RUNNABLE}<br>
 *     A thread executing in the Java virtual machine is in this state.
       线程在虚拟机中执行,进入RUNABLE状态(又细分为READY(就绪)-中间等待分配时间片段-以及RUNNING(运行中))
 *     </li>
 
 * <li>{[@link](https://my.oschina.net/u/393) #BLOCKED}<br>
 *     A thread that is blocked waiting for a monitor lock
 *     is in this state.
      一个线程在等待获取监视器锁的时候进入线程阻塞状态,即排队获取锁的状态。
 *     </li>
 
 * <li>{[@link](https://my.oschina.net/u/393) #WAITING}<br>
 *     A thread that is waiting indefinitely for another thread to
 *     perform a particular action is in this state.
       等待其它线程唤醒时处于等待状态。
 *     </li>
 
 * <li>{[@link](https://my.oschina.net/u/393) #TIMED_WAITING}<br>
 *     A thread that is waiting for another thread to perform an action
 *     for up to a specified waiting time is in this state.
       在一定时间里等待其它线程唤醒,超过时间唤醒线程重新获取锁。
 *     </li>
 
 * <li>{@link #TERMINATED}<br>
 *     A thread that has exited is in this state.
       一个线程的结束状态。
 *     </li>
 
 * </ul>
 *
 * <p>
 * A thread can be in only one state at a given point in time.
 * These states are virtual machine states which do not reflect
 * any operating system thread states.
 *
 * @since   1.5
 * @see #getState
 */
 
 
public enum State {
    /**
     * Thread state for a thread which has not yet started.
     */
    NEW,

    /**
     * Thread state for a runnable thread.  A thread in the runnable
     * state is executing in the Java virtual machine but it may
     * be waiting for other resources from the operating system
     * such as processor.
     */
    RUNNABLE,

    /**
     * Thread state for a thread blocked waiting for a monitor lock.
     * A thread in the blocked state is waiting for a monitor lock
     * to enter a synchronized block/method or
     * reenter a synchronized block/method after calling
     * {@link Object#wait() Object.wait}.
     */
    BLOCKED,

    /**
     * Thread state for a waiting thread.
     * A thread is in the waiting state due to calling one of the
     * following methods:
     * <ul>
     *   <li>{@link Object#wait() Object.wait} with no timeout</li>
     *   <li>{@link #join() Thread.join} with no timeout</li>
     *   <li>{@link LockSupport#park() LockSupport.park}</li>
     * </ul>
     *
     * <p>A thread in the waiting state is waiting for another thread to
     * perform a particular action.
     *
     * For example, a thread that has called <tt>Object.wait()</tt>
     * on an object is waiting for another thread to call
     * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
     * that object. A thread that has called <tt>Thread.join()</tt>
     * is waiting for a specified thread to terminate.
     */
    WAITING,

    /**
     * Thread state for a waiting thread with a specified waiting time.
     * A thread is in the timed waiting state due to calling one of
     * the following methods with a specified positive waiting time:
     * <ul>
     *   <li>{@link #sleep Thread.sleep}</li>
     *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
     *   <li>{@link #join(long) Thread.join} with timeout</li>
     *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
     *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
     * </ul>
     */
    TIMED_WAITING,

    /**
     * Thread state for a terminated thread.
     * The thread has completed execution.
     */
    TERMINATED;
}`
  • 结下来我们看一下线程流转的示例图
线程状态流转示例
线程状态流转示例
  • 然后我们用代码演示一遍
  • NEW (在创建一个线程对象后至调用start()之前,线程状态处于NEW),调用start()之后进入RUNABLE,线程执行结束进入BLOCKD状态

`package com.example.demo.thread;

/**

  • 线程状态转换演示 NEW RUNABLE */ public class ThreadNewRunable extends Thread { private byte[] lock = new byte[0]; public ThreadNewRunable(byte[] lock) { this.lock = lock; } @Override public void run() { // doNothing

// synchronized (lock) { // try { // Thread.sleep(1000);// 休眠十秒,防止过快结束 // } catch (InterruptedException e) { // e.printStackTrace(); // } // } }

代码语言:javascript
复制
public static void main(String[] args) throws InterruptedException {


    byte[] lock = new byte[0];
    ThreadNewRunable threadNewRunable = new ThreadNewRunable(lock);
    System.out.println("threadStatu-new :" + threadNewRunable.getState());

    threadNewRunable.start();
    System.out.println("threadStatus-start:" + threadNewRunable.getState());

    ThreadNewRunable threadNewRunable1 = new ThreadNewRunable(lock);
    threadNewRunable1.start();


    Thread.sleep(1000);

    System.out.println("threadStatu1-blocked : " + threadNewRunable1.getState());
}

}

`

  • 输出结果

threadStatu-new :NEW threadStatus-start:RUNNABLE threadStatu1-blocked : TERMINATED

  • BLOCKED 在线程等待获取锁,synchronized块或者synchronized方法时,线程进入阻塞状态

`package com.example.demo.thread;

public class ThreadBlocked extends Thread {

代码语言:javascript
复制
private byte[] lock = new byte[0];

public ThreadBlocked(byte[] lock) {
    this.lock = lock;
}

@Override
public void run() {

    synchronized (lock) {
        try {
            Thread.sleep(10000);// 休眠十秒,防止过快结束
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public static void main(String[] args) throws InterruptedException {
    byte[] lock = new byte[0];
    ThreadBlocked threadBlocked = new ThreadBlocked(lock);
    threadBlocked.start();
    ThreadBlocked threadBlocked1 = new ThreadBlocked(lock);
    threadBlocked1.start();
    Thread.sleep(1000);
    System.out.println("threadBlocked1-blocked : " + threadBlocked1.getState());
}

}

`

  • 输出

threadBlocked1-blocked : BLOCKED

  • WAITING (当执行 Object.wait(); Thread.join(); LockSupport.park();时,线程计入等待状态)
  • Object.wait()

`package com.example.demo.thread;

public class ThreadWaitingObjectWait extends Thread {

代码语言:javascript
复制
private byte[] lock = new byte[0];

public ThreadWaitingObjectWait(byte[] lock) {
    this.lock = lock;
}

@Override
public void run() {

    synchronized (lock) {
        try {
            lock.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public static void main(String[] args) throws InterruptedException {
    byte[] lock = new byte[0];
    ThreadWaitingObjectWait waitingObjectWait = new ThreadWaitingObjectWait(lock);
    waitingObjectWait.start();
    Thread.sleep(100);

    System.out.println("waitingObjectWait wait.start(): " + waitingObjectWait.getState());

    synchronized (lock) {
        lock.notify();
    }
    Thread.sleep(100);
    System.out.println("waitingObjectWait lock.notify() :" + waitingObjectWait.getState());
}

} `

  • 输出

waitingObjectWait wait.start(): WAITING waitingObjectWait lock.notify() :TERMINATED

  • LockSupport.park()

`package com.example.demo.thread;

import java.util.concurrent.locks.LockSupport;

public class ThreadWaitingPark extends Thread {

代码语言:javascript
复制
private byte[] lock = new byte[0];

public ThreadWaitingPark(byte[] lock) {
    this.lock = lock;
}

@Override
public void run() {

        // 以下三种均可使线程进入waiting状态

// Object.wait(); // Thread.join();; LockSupport.park();

代码语言:javascript
复制
}

public static void main(String[] args) throws InterruptedException {
    byte[] lock = new byte[0];
    ThreadWaitingPark threadWaitingPark = new ThreadWaitingPark(lock);
    threadWaitingPark.start();
    Thread.sleep(1000);
    System.out.println("threadWaiting-Waiting-when LockSupport.park() : " + threadWaitingPark.getState());
    LockSupport.unpark(threadWaitingPark);
    Thread.sleep(1000);
    System.out.println("threadWaiting-Waiting-when LockSupport.unpark(thread)  : " + threadWaitingPark.getState());


}

} `

  • 输出

threadWaiting-Waiting-when LockSupport.park() : WAITING threadWaiting-Waiting-when LockSupport.unpark(thread) : TERMINATED

  • Thread.join()

`package com.example.demo.thread;

import org.jetbrains.annotations.NotNull;

public class ThreadWaitingThreadJoin extends Thread {

代码语言:javascript
复制
private Thread thread = new Thread();

public ThreadWaitingThreadJoin(Thread thread) {
    this.thread = thread;
}

@Override
public void run() {
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) throws InterruptedException {
    byte[] lock = new byte[0];
    ThreadNewRunable threadNewRunable = new ThreadNewRunable(lock);
    threadNewRunable.start();
    ThreadWaitingThreadJoin threadWaitingThreadJoin = new ThreadWaitingThreadJoin(threadNewRunable);
    threadWaitingThreadJoin.start();
    Thread.sleep(100);
    System.out.println("threadWaitingThreadJoin.join() : " + threadWaitingThreadJoin.getState());
}

} `

  • 输出

threadWaitingThreadJoin.join() : TERMINATED

  • TIMEDWAITING (WAITING等待只要没有线程唤醒,它就一直等待下去,而TIMEDWAITING则会在超出等待时间后唤醒线程去获取锁)

当执行 Thread.sleep(long); Object.wait(long); Thread.join(long); LockSupport.parkNanos(); LockSupport.parkUntil(); 时线程会进入延时等待状态。

  • Thread.sleep(long)

`package com.example.demo.thread;

public class ThreadTimedWaitingThreadSleep extends Thread {

代码语言:javascript
复制
private byte[] lock = new byte[0];

public ThreadTimedWaitingThreadSleep(byte[] lock) {
    this.lock = lock;
}

@Override
public void run() {
    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) throws InterruptedException {
    byte[] lock = new byte[0];
    ThreadTimedWaitingThreadSleep timedWaitingThreadSleep = new ThreadTimedWaitingThreadSleep(lock);
    timedWaitingThreadSleep.start();
    Thread.sleep(100);
    System.out.println("timedWaitingThreadSleep Thread.sleep(long) : " + timedWaitingThreadSleep.getState());
}

} `

  • 输出

timedWaitingThreadSleep Thread.sleep(long) : TIMED_WAITING

  • Object.wait(long)

`package com.example.demo.thread;

public class ThreadTimedWaitingObjectWait extends Thread { private byte[] lock = new byte[0];

代码语言:javascript
复制
public ThreadTimedWaitingObjectWait(byte[] lock) {
    this.lock = lock;
}

@Override
public void run() {


    synchronized (lock) {
        // 其它使线程进入timedWaiting
        // Thread.join(long)
        //LockSupport.parkNanos()
        //LockSupport.parkUntil()
        try {
            lock.wait(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public static void main(String[] args) throws InterruptedException {
    byte[] lock = new byte[0];
    ThreadTimedWaitingObjectWait timedWaitingObjectWait = new ThreadTimedWaitingObjectWait(lock);
    timedWaitingObjectWait.start();
    Thread.sleep(100);

    System.out.println("timedWaitingObjectWait wait.start(): " + timedWaitingObjectWait.getState());

    Thread.sleep(2000);
    System.out.println("timedWaitingObjectWait after sleep(20000) :" + timedWaitingObjectWait.getState());
}

} `

  • 输出

timedWaitingObjectWait wait.start(): TIMED_WAITING

  • 源码在下面这个工程的tread包里,需要自取

源码仓库地址

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
NAT 网关
NAT 网关(NAT Gateway)提供 IP 地址转换服务,为腾讯云内资源提供高性能的 Internet 访问服务。通过 NAT 网关,在腾讯云上的资源可以更安全的访问 Internet,保护私有网络信息不直接暴露公网;您也可以通过 NAT 网关实现海量的公网访问,最大支持1000万以上的并发连接数;NAT 网关还支持 IP 级流量管控,可实时查看流量数据,帮助您快速定位异常流量,排查网络故障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档