美文网首页
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.线程状态

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