2021-02-18Java学习记录

java基础------多线程(Thread.join抛InterruptedException异常)

在这里插入图片描述

当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法。

抛InterruptedException的代表方法有:

  • java.lang.Object 类的 wait 方法
  • java.lang.Thread 类的 sleep 方法
  • java.lang.Thread 类的 join 方法

需要花点时间的方法

  • 执行wait方法的线程,会进入等待区等待被notify/notify All。在等待期间,线程不会活动。

  • 执行sleep方法的线程,会暂停执行参数内所设置的时间。

  • 执行join方法的线程,会等待到指定的线程结束为止。

可以取消的方法

因为需要花时间的操作会降低程序的响应性,所以可能会取消/中途放弃执行这个方法。这里主要是通过interrupt方法来取消。

  • sleep方法与interrupt方法

interrupt方法是Thread类的实例方法,在执行的时候并不需要获取Thread实例的锁定,任何线程在任何时刻,都可以通过线程实例来调用其他线程的interrupt方法。
当在sleep中的线程被调用interrupt方法时,就会放弃暂停的状态,并抛出InterruptedException异常,这样一来,线程的控制权就交给了捕捉这个异常的catch块了。

  • wait方法和interrupt方法

当线程调用wait方法后,线程在进入等待区时,会把锁定接触。当对wait中的线程调用interrupt方法时,会先重新获取锁定,再抛出InterruptedException异常,获取锁定之前,无法抛出InterruptedException异常。

  • join方法和interrupt方法

当线程以join方法等待其他线程结束时,一样可以使用interrupt方法取消。因为join方法不需要获取锁定,故而与sleep一样,会马上跳到catch程序块

interrupt方法干了什么?
interrupt方法其实只是改变了中断状态而已。而sleep、wait和join这些方法的内部会不断的检查中断状态的值,从而自己抛出InterruptEdException。

所以,如果在线程进行其他处理时,调用了它的interrupt方法,线程也不会抛出InterruptedException的,只有当线程走到了sleep, wait, join这些方法的时候,才会抛出InterruptedException。若是没有调用sleep, wait, join这些方法,或者没有在线程里自己检查中断状态,自己抛出InterruptedException,那InterruptedException是不会抛出来的。

isInterrupted方法,可以用来检查中断状态

Thread.interrupted方法,可以用来检查并清除中断状态。

java基础------多线程(为主线程和分线程设置优先级写法异同)

主线程:

  • 获取主线程名:Thread.currentThread().getName()
  • 获取主线程优先级:Thread.currentThread().getPriority()

分线程:

  • 获取分线程名:对象名.getName()
  • 获取分线程优先级:对象名.getPriority()

设置分线程和主线程的优先级

  • 对象名.setPriority(Thread.MAX_PRIORITY);//分线程设置
  • Thread.currentThread().setPriority(Thread.MIN_PRIORITY);//主线程设置

在这里插入图片描述

java基础------多线程(继承Thread方式中,买票如何共享票数问题)

解决方案:将票的私有属性设置为静态的;

例如:private static int ticket = 100;

注意:继承Thread方式中才需要。而实现Runnable中默认共享!不要设置为静态的

java基础------多线程(实现Runnable接口创建线程方式中t1.start()的源码理解)

t1.start()的源码理解:

  • 启动线程
  • 调用当前线程的run()方法

在这里插入图片描述
问题:明明调用的是Thread中的run()方法,又如何转到调用Runnable接口实现类中的run()方法?----看源码

源码1:Thread中的run()
在这里插入图片描述
源码2:Thread中的target源码
在这里插入图片描述
由上图可知:target是Runnable类型的
在这里插入图片描述
由上图创建对象时的Thread构造器

猜你喜欢

转载自blog.csdn.net/m0_51755061/article/details/113841620
今日推荐