• 总结 Thread 类的基本用法


    1、线程创建

    博主另外整理过了,链接:http://t.csdn.cn/DeRKj

    2、线程中断

    2.1、直接定义一个标志位,作为线程是否结束的标记

    1. private static boolean isQuit;
    2. //标记
    3. public static void main(String[] args) {
    4. Thread t = new Thread(()-> {
    5. while(!isQuit) {
    6. System.out.println("thread");
    7. try {
    8. Thread.sleep(1000);
    9. } catch (InterruptedException e) {
    10. throw new RuntimeException(e);
    11. }
    12. }
    13. System.out.println("线程t执行结束");
    14. });
    15. t.start();
    16. try {
    17. Thread.sleep(3000);
    18. } catch (InterruptedException e) {
    19. throw new RuntimeException(e);
    20. }
    21. isQuit=true;
    22. System.out.println("设置让t线程结束");
    23. }

    2.2、可以使用标准库里面自带的一个标志位

    1. public static void main(String[] args) {
    2. Thread t = new Thread(()-> {
    3. while(!Thread.currentThread().isInterrupted()) {
    4. //currentThread()是Thread类的静态方法
    5. //通过这个方法,就可以拿到当前线程的实例
    6. //isInterrupted()这个方法就是在判定标志位
    7. System.out.println("thread");
    8. try {
    9. Thread.sleep(1000);
    10. } catch (InterruptedException e) {
    11. //throw new RuntimeException(e);
    12. //方式一:立即结束线程
    13. break;
    14. //方式二:线程继续执行,不管
    15. //方式三:稍后处理,例:
    16. //Thread.sleep(1000);
    17. //break;
    18. }
    19. }
    20. System.out.println("线程t执行结束");
    21. });
    22. t.start();
    23. try {
    24. Thread.sleep(3000);
    25. } catch (InterruptedException e) {
    26. throw new RuntimeException(e);
    27. }
    28. t.interrupt();
    29. //在主线程中,设置t.interrupt()来中断这个线程,设置标志位为true
    30. System.out.println("设置让t线程结束");
    31. }

    3、线程等待

            由于线程之间的调度顺序是不确定的,因此通过特殊操作,对线程的执行顺序,作出干预,例如:

            通过join()方法,控制线程之间的结束顺序

            在main中调用join:让main线程阻塞等待,等到t执行完了,main才继续执行

    1. public static void main(String[] args) {
    2. Thread t = new Thread(()-> {
    3. int i=0;
    4. while( i<3) {
    5. System.out.println("Thread");
    6. try {
    7. Thread.sleep(1000);
    8. } catch (InterruptedException e) {
    9. throw new RuntimeException(e);
    10. }
    11. i++;
    12. }
    13. });
    14. t.start();
    15. System.out.println("main线程join之前");
    16. try {
    17. t.join();
    18. } catch (InterruptedException e) {
    19. throw new RuntimeException(e);
    20. }
    21. System.out.println("main线程结束join之后");
    22. }

    注:Java中的多线程方法,只要这个方法会阻塞,都可 能抛出InterrupttedException异常

    输出:

    注:有人会问,线程之间的调度顺序不是不确定的吗?那为什么这里是先打印“ main线程join之前”,再打印“Thread"?

    解答:首先,你的想法是对的,确实先打印哪一个就是不确定,但即使如此,大概率还是先打印main.因为在start之后,内核要创建线程(有开销),start调用的时候,为了执行新线程的代码,需要先做一些准备工作,因此导致大概率先打印“main线程join之前”,但并非百分之分。

    另外join也又另外两种带参数的,可以控制阻塞时长:

    4、线程休眠

            上述的例子中,我们会看到有一个sleep方法,就是线程休眠,代码中是休眠一千毫秒的,但实际上并非如此,而是大于等于1000(因为线程的调度是不可控的)

    5、获取线程实例

    方法:

    方法说明
    public static Thread currentThread();返回当前对象的引用

    例:

    1. Thread thread = Thread.currentThread();
    2. System.out.println(thread.getName());

  • 相关阅读:
    一分钟学会Selenium
    【USRP】报错:Error: RuntimeError: [ad9361_device_t] BBPLL not locked
    Pr:导出设置之编码设置
    处理本地DNS劫持,导致域名解析失败
    制造企业如何开展客户满意度调查?民安智库为你解答
    一文了解前端面试重点--闭包
    Python突破浏览器TLS/JA3 指纹
    作为一名外贸业务员,如何正确跟进客户?
    消除数据库表中的重复组
    原来大厂都是这样监控Tomcat性能的,废话不多说,直接开干
  • 原文地址:https://blog.csdn.net/LYJbao/article/details/126627118