线程

一、创建线程

Thread对象的start()方法开始运行一个线程,再一个新的线程中执行的代码总是run()方法,它是公有的,不接受参数而且没有返回值。用户调用线程对象的start()方法来启动线程,这样run()就会被调用。

1、定义线程的两种方式:
  • 将其定义为Thread类的子类,并提供run()方法的定义来替代继承的run()方法。
  • 将其定义为实现接口Runnable的形式,这个接口声明run()方法,然后在需要的时候在类中创建一个Thread对象。
2、守护线程和用户线程
  • 守护线程只是一个后台运行的线程,它从属于创建它的线程。调用Thread类的setDaemon()方法,使得生成的线程成为一个守护线程。当创建守护线程的线程结束时,守护线程也随之消失。
  • 不是守护线程的线程称为用户线程,用户线程拥有自己的生命周期,不依赖于创建它的线程。在创建它的线程结束后用户线程仍能继续运行。
  • 运行有限的一段时间的线程一般来说是用户线程,但是也不能说守护线程就不能是有限的。无限运行的线程通常应该定义成守护线程,只是因为需要一种结束它们的方式。
  • 注意,只能在启动线程前来调用它的setDaemon()方法。如果试图在线程启动后调用,该方法就将抛出一个IllegalThreadStateException异常。另外,由守护线程创建的线程默认为守护线程。

二、停止线程

  • 线程通过调用Thread对象的interrupt()方法来发送信号给另一个线程告诉它该停止运行了。这本身并不能停止线程,它只是在线程中设置一个标志,指出有一个中断请求。调用interrupt()方法后,如果代码后面还存在sleep()方法,那么sleep()会检测线程是否已经被中断,如果已经被中断,就会抛出InterruptedException异常。
  • 可以通过调用线程的isInterrupted()方法检测线程是否已经中断。如果被检测的线程的interrupt()方法被调用,isInterrupted()方法就会返回true。

连接线程

  • main方法里面调用Thread.join(),会先暂停main线程,直到创建的Thread线程结束,然后main线程才会继续执行。
  • 如果当前的线程被另一个线程中断,join()方法会抛出一个InterruptedException异常。所以需要把join()方法放入try中。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。