在Java中,线程管理涉及创建、启动、停止、调度和监控线程等。以下是一些Java中常见的线程管理任务以及如何进行线程管理的方法:
- 创建线程:在Java中,创建线程有多种方式,以下是常见的几种创建线程的方式:从官方Thread类的代码注释上看,创建线程的方式只有继承Thread类和实现Runnable接口两种。至于使用匿名内部类和使用Lambda表达式只是写法不同而已。至于线程池呢,本质是池化技术,用于管理和重用线程的,所以不能算创建线程的方式。
- 启动线程:使用Thread类的start()方法来启动线程。线程启动后,会自动执行run()方法中的代码。
- 线程调度:Java提供了线程调度器来决定线程的执行顺序。你可以使用Thread类的yield()方法来建议线程调度器将CPU时间片切换给其他线程,或者使用Thread类的sleep()方法来让线程休眠一段时间。线程调度是指系统为线程分配CPU使用权的过程,主要调度方式有以下两种:
- 协同式线程调度:使用协同式线程调度的多线程系统,线程执行的时间由线程本身来控制,线程把自己的工作执行完之后,要主动通知系统切换到另外一个线程上。使用协同式线程调度的最大优点是实现简单,由于线程把自己的事情做完后才通知操作系统进行线程切换,所以不存在线程同步问题,但是缺点也很明显,如果一个线程出了问题,则程序就会一直阻塞。
- 抢占式线程调度:使用抢占式线程调度的多线程系统,每个线程执行的时间以及是否切换都由操作系统决定。这种情况,线程的执行时间将不可控,所以不存在一个线程导致整个进程阻塞的问题。
- 线程优先级:可以为线程设置优先级,高优先级的线程在竞争CPU时间片时更有可能被执行。但是,优先级的实际影响因操作系统而异,不应过度依赖。Thread类的setPriority(Thread.MAX_PRIORITY) 可以设置线程优先级为最高。
- 线程状态监控:你可以使用Thread类的方法来查询线程的状态、获取线程名称等信息。 调用Thread类的getState()来获取线程状态。调用Thread类的getName()来获取线程名称。
- 线程中断:有以下三种方式:
- 第一种是线程自然终止。
- 第二种是调用Thread.stop()方法,该方法已过时,不建议使用,为什么不建议使用,后面会单独讲,有道面试题可能会问到。
- 调用Thread.interrupt()方法,推荐使用这种方式。
- 等待线程完成:使用Thread类的join()方法可以等待一个线程执行完毕。这在需要等待某个线程完成后再执行其他操作时很有用。
- 守护线程:调用Thread类的setDaemon(true)你可以将线程设置为守护线程,它会在所有非守护线程结束后自动退出。守护线程通常用于后台任务。