Thread线程的理解

sleep()方法

该方法是让线程睡眠,注意睡眠的线程是当前执行的线程,如下代码,睡眠的是main线程,不是t1线程,如果要让t1睡眠,sleep的位置应该是在A線程裏面的run()方法,并且sleep是静态方法,调用不应该用实例调用,应该是Thread.sleep(),别让t1.sleep()的方法误导,误以为是t1线程睡眠。

package com.xxl.rpc.test;

public class Interrupt {


    public static void main(String[] args) {
        A a = new A();
        Thread t1 = new Thread(a);
        t1.start();
        System.out.println("执行睡眠之前2:" + t1.isInterrupted());
        try {
            t1.sleep(2000);//线程进入阻塞状态
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(123);
    }
}

class A implements Runnable {

    @Override
    public void run() {
        long now = System.currentTimeMillis();
        boolean flag = true;
        while (System.currentTimeMillis() - now < 1000) {
            System.out.println(222);
        }
    }
}



线程的中断

主要涉及到三个方法,如下
1.public void interrupt():中断该线程
2.public static boolean interrupted() 返回该线程的中断状态,并清除中断状态,该方法其实是调用了另一个中断方法private native boolean isInterrupted(boolean ClearInterrupted),ClearInterrupted为ture,标识清楚中断标志。
3.public boolean isInterrupted() {
return isInterrupted(false);
}返回线程的中断状态,但是不清楚中断状态。

线程的中断是会唤醒sleep、wait、join中的线程,也就是说会让这些方法抛出InterruptedException异常,从而唤醒线程,如下代码

package com.xxl.rpc.test;

public class Interrupt {


    public static void main(String[] args) {
        Thread b = new B();
        b.start();
        b.interrupt();
    }
}

class B extends Thread {

    @Override
    public void run() {
        System.out.println("do something");
        try {
            System.out.println("线程中断状态"+this.isInterrupted());
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            //false说明抛出异常导致中断状态被清除
            System.out.println("线程中断状态"+this.isInterrupted());
            System.out.println("中断抛出的异常");
            //do something else
        }

    }
}

执行结果如下:
do something
线程中断状态true
线程中断状态false
中断抛出的异常

Process finished with exit code 0

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 进程和线程 进程 所有运行中的任务通常对应一个进程,当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中...
    胜浩_ae28阅读 5,142评论 0 23
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,493评论 1 15
  • 一、线程的生命周期 线程状态转换图: 1、新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线...
    我是嘻哈大哥阅读 961评论 0 8
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 2,987评论 1 18
  • make it be ready
    FNI阅读 459评论 0 51