美文网首页
2.线程状态

2.线程状态

作者: 强某某 | 来源:发表于2020-03-03 15:00 被阅读0次

线程的状态

  1. New:尚未启动的线程的线程状态
  2. Runnable:调用start,可运行线程的线程状态,但是实际上不见得在运行,需要等待CPU调度
  3. Blocked: 线程阻塞等待监视器锁定的线程状态,处于synchronized同步代码块或方法中被阻塞
  4. Waiting:等待线程的线程状态。不带超时的方式:
    Object.wait、Thread.join、LockSupport.park
  5. Timed Waiting:具有指定等待时间的等待线程的线程状态。带超时的方式:
    Thread.sleep、Object.wait、Thread.join、LockSupport.parkNanos、LockSupport.parkUntil
  6. Terminated: 终止线程的线程状态。线程正常完成执行或出现异常
1.png

线程中止

  1. interrupt
    如果目标线程在调用Object class的wait()、wait(long)或wait(long,int)
    方法、join()、join(long,int)或sleep(long,int)方法时被阻塞,那么interrupt会生效,该线程的中断状态将被清除,抛出interruptedException异常。
    如果目标线程是被I/O或者NIO中的Channel所阻塞,同样,I/O操作会被中断或者返回特殊异常值。达到终止线程的目的。
    如果以上条件都不满足,则会设置此线程的中断状态

案例说明

  • 用interrupt中断程序
public class InterruptionInJava implements Runnable{
    @Override
    public void run() {
        while (true) {
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("Yes!!  I'm Interupted,  but I'm still running");
            } else {

            }
        }
//        System.out.println("Oh, myGod!");
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new InterruptionInJava(), "testThread");
        thread.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {

        }
        System.out.println("Begin Interupt...");
        thread.interrupt();
        System.out.println("End Interupt...");
    }
}

输出

Yes!!  I'm Interupted,  but I'm still running
Yes!!  I'm Interupted,  but I'm still running
Yes!!  I'm Interupted,  but I'm still running
Yes!!  I'm Interupted,  but I'm still running
Yes!!  I'm Interupted,  but I'm still running
Yes!!  I'm Interupted,  but I'm still running
Yes!!  I'm Interupted,  but I'm still running

问题:虽然是被中断状态,但实际并未中断

  • interrupt说明

在java中主要有3个相关方法,interrupt(),isInterrupted()和interrupted()。

- interrupt(),在一个线程中调用另一个线程的interrupt()方法,即会向那个线程发出信号——线程中断状态已被设置。至于那个线程何去何从,由具体的代码实现决定。
- isInterrupted(),用来判断当前线程的中断状态(true or false)。
- interrupted()是个Thread的static方法,用来恢复中断状态,调用之后isInterrupted获取的就是false了
  • 解决上面问题
public class InterruptionInJava implements Runnable{
    @Override
    public void run() {
        while (true) {
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("Yes!!  I'm Interupted,  but I'm still running");
                return;
            } else {

            }
        }
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new InterruptionInJava(), "testThread");
        thread.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {

        }
        System.out.println("Begin Interupt...");
        thread.interrupt();
        System.out.println("End Interupt...");
    }
}
  1. 标记位

相关文章

  • 2.线程状态

    线程的状态 New:尚未启动的线程的线程状态 Runnable:调用start,可运行线程的线程状态,但是实际上不...

  • 2.线程的状态

  • 线程状态

    java线程与操作系统线程状态略有不同。 1. 操作系统底层线程状态: 课本经典五状态: 2. JAVA线程状态:...

  • IOS多线程相关方法

    1.线程状态 2.创建线程的方式

  • 线程笔记三(线程的睡眠和唤醒)

    线程笔记三(线程的睡眠和唤醒) 1.线程流程图: 2.线程的状态 New(新建状态):Threadn thread...

  • java线程状态和线程池

    本节总结线程相关知识:线程状态和线程池。1.线程的五个状态 关于如何终止线程,以下仅供参考: 2.线程池

  • 线程状态和调用方法

    一 线程状态以及互相之间的转换 线程状态可以分为5种: 1. 初始状态:新建了一个线程对象 2. 就绪状态:(可运...

  • java多线程基础

    多线程 线程,进程,多线程 一、java线程 1. 线程状态 2. 线程方法 方法说明setPriority(in...

  • Java线程之线程的五种状态

    线程的 5 中状态 1. New 新建状态 2. Runnable 可运行(就绪)状态 当线程处于 Runnab...

  • Java线程的状态

    Java线程的状态 线程的状态摘录 1.新建(NEW):新创建了一个线程对象。 2.可运行(RUNNABLE):线...

网友评论

      本文标题:2.线程状态

      本文链接:https://www.haomeiwen.com/subject/lqqhlhtx.html