线程相关的基本方法有 wait,notify,notifyAll,sleep,join,yield 等。

|
方法
|
作用
|
|
线程等待(wait )
|
调用该方法的线程进入 WAITING(等待) 状态,只有等待另外线程的通知或被中断才会返回,需要注意的是调用 wait()方法后,会释放对象的锁。因此,wait 方法一般用在同步方法或同步代码块中。
|
|
线程睡眠(sleep )
|
sleep 导致当前线程休眠,与 wait 方法不同的是sleep 不会释放当前占有的锁,sleep(long)会导致线程进入 TIMED-WATING(超时等待) 状态,而wait()方法会导致当前线程进入 WATING 状态。
|
|
线程让步(yield )
|
yield 会使当前线程让出 CPU 执行时间片(进入就绪状态),与其他线程一起重新竞争 CPU 时间片。一般情况下,优先级高的线程有更大的可能性成功竞争得到CPU 时间片,但这又不是绝对的(它自己也可以拿到),有的操作系统对线程优先级并不敏感。
|
|
Join 等待其他线程终止
|
join() 方法,等待其他线程终止,在当前线程中调用一个线程的 join() 方法,则当前线程转为阻塞状态,等待另一个线程结束,当前线程再由阻塞状态变为就绪状态,等待 cpu 的宠幸。
|
|
线程唤醒(notify)
|
Object 类中的 notify() 方法,唤醒在此对象监视上等待的单个线程,如果所有线程都在此对象上等待,则会选择唤醒其中一个线程,选择是任意的,并在对实现做出决定时发生,线程通过调用其中一个 wait() 方法,在对象的监视器上等待,直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程,被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争。类似的方法还有 notifyAll() ,唤醒再次监视器上等待的所有线程。
|
|
线程中断(interrupt)
|
中断一个线程,其本意是给这个线程一个通知信号,会影响这个线程内部的一个中断标识位。这个线程本身并不会因此而改变状态(如阻塞,终等)。
|
补充说明:
线程中断(interrupt )
- 调用 interrupt()方法并不会中断一个正在运行的线程。也就是说处于 Running 状态的线程并不会因为被中断而被终止,仅仅改变了内部维护的中断标识位而已。
- 若调用 sleep()而使线程处于 TIMED-WATING 状态,这时调用 interrupt()方法,会抛出InterruptedException,从而使线程提前结束 TIMED-WATING 状态。
- 许多声明抛出 InterruptedException 的方法(如 Thread.sleep(long mills 方法)),抛出异常前,都会清除中断标识位,所以抛出异常后,调用 isInterrupted()方法将会返回 false。
- 中断状态是线程固有的一个标识位,可以通过此标识位安全的终止线程。比如,你想终止一个线程thread的时候,可以调用thread.interrupt()方法,在线程的run方法内部可以根据 thread.isInterrupted()的值来优雅的终止线程。
为什么要用 join() 方法 ?
很多情况下,主线程生成并启动了子线程,需要用到子线程返回的结果,也就是需要主线程需要在子线程结束后再结束,这时候就要用到 join() 方法。
其他方法补充:
方法 |
作用 |
sleep() |
强迫一个线程睡眠N毫秒。 |
isAlive() |
判断一个线程是否存活。 |
join() |
等待线程终止。 |
activeCount() |
程序中活跃的线程数。 |
enumerate() |
枚举程序中的线程。 |
currentThread() |
得到当前线程。 |
isDaemon() |
一个线程是否为守护线程。 |
setDaemon() |
设置一个线程为守护线程。(用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束) |
setName() |
为线程设置一个名称。 |
wait() |
强迫一个线程等待 |
sleep和wait的区别
- 对于 sleep()方法,我们首先要知道该方法是属于 Thread 类中的。而 wait()方法,则是属于Object 类中的。
- sleep()方法导致了程序暂停执行指定的时间,让出 cpu 该其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态。
- 在调用 sleep()方法的过程中,线程不会释放对象锁,而当调用 wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用 notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
后台线程
优先级比较低,为用户线程 提供 公共服务, setDaemon(true)来设置线程为“守护线程”,在 Daemon 线程中产生的新线程也是 Daemon 的。
守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。当 JVM 中所有的线程都是守护线程的时候,JVM 就可以退出了;如果还有一个或以上的非守护线程则 JVM 不会退出。
浙公网安备 33010602011771号