首页 > 代码库 > Java多线程-线程控制
Java多线程-线程控制
休眠线程:
public static void sleep(long millis) throws InterruptedException
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。该线程不丢失任何监视器的所属权。
线程加入
public final void join() throws InterruptedException
等待该线程终止。
- 抛出:
InterruptedException
- 如果另一个线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。 - 线程礼让
public static void yield()
暂停当前正在执行的线程对象,并执行其他线程。
让多个线程的执行更和谐
守护线程
public final void setDaemon(boolean on)
- 将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。
该方法必须在启动线程前调用。
该方法首先调用该线程的
checkAccess
方法,且不带任何参数。这可能抛出SecurityException
(在当前线程中)。 - 参数:
on
- 如果为true
,则将该线程标记为守护线程。- 抛出:
IllegalThreadStateException
- 如果该线程处于活动状态。SecurityException
- 如果当前线程无法修改该线程。
中断线程
public final void stop()
- 已过时。 该方法具有固有的不安全性。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查
ThreadDeath
异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop
的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。如果目标线程等待很长时间(例如基于一个条件变量),则应使用interrupt
方法来中断该等待。有关更多信息,请参阅《为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?》。 - 强迫线程停止执行。
如果安装了安全管理器,则以
this
作为其参数调用checkAccess
方法。这可能引发SecurityException
(在当前线程中)。如果该线程不同于当前线程(即当前线程试图终止除它本身以外的某一线程),则安全管理器的
checkPermission
方法(带有RuntimePermission("stopThread")
参数)也会被调用。这会再次抛出SecurityException
(在当前线程中)。无论该线程在做些什么,它所代表的线程都被迫异常停止,并抛出一个新创建的
ThreadDeath
对象,作为异常。停止一个尚未启动的线程是允许的。如果最后启动了该线程,它会立即终止。
应用程序通常不应试图捕获
ThreadDeath
,除非它必须执行某些异常的清除操作(注意,抛出ThreadDeath
将导致try
语句的finally
子句在线程正式终止前执行)。如果catch
子句捕获了一个ThreadDeath
对象,则重新抛出该对象很重要,因为这样该线程才会真正终止。对其他未捕获的异常作出反应的顶级错误处理程序不会打印输出消息,或者另外通知应用程序未捕获到的异常是否为
ThreadDeath
的一个实例。 - 抛出:
SecurityException
- 如果当前线程不能修改该线程。
public void interrupt()
- 中断线程。
如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的
checkAccess
方法就会被调用,这可能抛出SecurityException
。如果线程在调用
Object
类的wait()
、wait(long)
或wait(long, int)
方法,或者该类的join()
、join(long)
、join(long, int)
、sleep(long)
或sleep(long, int)
方法过程中受阻,则其中断状态将被清除,它还将收到一个InterruptedException
。如果该线程在
可中断的通道
上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个
ClosedByInterruptException
。如果该线程在一个
Selector
中受阻,则该线程的中断状态将被设置,它将立即从选择操作返回,并可能带有一个非零值,就好像调用了选择器的wakeup
方法一样。如果以前的条件都没有保存,则该线程的中断状态将被设置。
- 抛出:
SecurityException
- 如果当前线程无法修改该线程
Java多线程-线程控制