Thread方法解释(join,sleep,yield,interrupt)
来源:互联网 发布:天下数据员工 编辑:程序博客网 时间:2024/06/03 16:36
join方法
几种重写的join方法
void join()
等待该线程终止。
void join(long millis)
等待该线程终止的时间最长为 millis 毫秒。
void join(long millis, int nanos)
等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。
抛出:
IllegalArgumentException - 如果 millis 值为负,则 nanos 的值不在 0-999999 范围内。
InterruptedException - 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。
如果在主线程main中创建一个子线程,并调用子线程的join()方法,则主线程会等待子线程执行完毕,或子线程执行时间完成后,再继续执行。
例子:
package processthread; /** * @author wangpei * @version *创建时间:2017年3月11日 上午9:57:13 * 类说明 */public class Test {class Thread1 extends Thread{ public void run(){ System.out.println("进入线程"+Thread.currentThread().getName()); }}public static void main(String[] args) { System.out.println("进入线程"+Thread.currentThread().getName()); Test ts=new Test(); Test.Thread1 t1=ts.new Thread1(); t1.start(); try { t1.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程"+Thread.currentThread().getName()+"继续执行");}}
main线程会等待,thread-0线程执行完毕后再执行。
结果:
进入线程main进入线程Thread-0线程main继续执行
没加t1.join(); 时结果:
进入线程main线程main继续执行进入线程Thread-0
看一下join方法源码:
可以看出,其延迟时间调用了wait(delay).因为线程调用wait()方法后,其对于正在操作的对象锁会自动释放,线程处于阻塞状态,所以,调用join方法后,线程阻塞,线程失去对该对象锁的持有,失去cpu.
对象锁:每个对象都有一个监听器,线程使用该对象时,必须先获得其监听器(锁),才能执行,而其他未获得该锁的对象处于阻塞状态.
sleep方法
static void sleep(long millis)
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
static void sleep(long millis, int nanos)
在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
nanos - 要休眠的另外 0-999999 纳秒。
可能抛出:
IllegalArgumentException - 如果 millis 值为负或 nanos 值不在 0-999999 范围内。
InterruptedException - 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。
sleep方法执行后,处于阻塞状态,线程会交出cpu,对该对象的锁没有交出,其他线程也无法访问该对象。
线程执行sleep方法,主线程不会像join方法那样等待子线程执行完再执行,mian线程会和子线程同时执行。
sleep方法源码,直接调用sleep()
public static void sleep(long millis, int nanos) throws InterruptedException { if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException( "nanosecond timeout value out of range"); } if (nanos >= 500000 || (nanos != 0 && millis == 0)) { millis++; } sleep(millis); }
yield方法
public static void yield()暂停当前正在执行的线程对象,并执行其他线程。
调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。它跟sleep方法类似,同样不会释放锁。但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。
注意,调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,这一点是和sleep方法不一样的。
interrupt方法
单独调用interrupt方法可以使得处于阻塞状态的线程抛出一个异常,也就说,它可以用来中断一个正处于阻塞状态的线程;另外,通过interrupt方法和isInterrupted()方法来停止正在运行的线程。
- Thread方法解释(join,sleep,yield,interrupt)
- Sleep/join/yield方法
- Thread 的sleep、wait、yield、interrupt
- Thread 的sleep、wait、yield、interrupt
- Thread 中 sleep、wait、yield、interrupt 区别
- 类Thread的三种方法:sleep(),join(),yield()
- [Java] Thread-01 sleep-join-yield
- 深入剖析Sleep、wait、notify、notifyAll、yield、join、Interrupt
- Thread 常搞混的几个概念sleep、wait、yield、interrupt
- Thread 的几个概念sleep、wait、yield、interrupt
- Thread常搞混的几个概念sleep、wait、yield、interrupt
- Thread 常搞混的几个概念sleep、wait、yield、interrupt
- Thread 常搞混的几个概念sleep、wait、yield、interrupt
- Thread 常搞混的几个概念sleep、wait、yield、interrupt
- 【java】Thread 常搞混的几个概念sleep、wait、yield、interrupt
- Thread 的几个概念sleep、wait、yield、interrupt
- Java多线程:(三)一些方法:start(),sleep(),yield(),join()
- 多线程操作的方法(sleep,)setPriority(Thread.MIN_PRIORITY);yield();
- MyEclipse不能自动编译解决方法总结(转)/debug时断点乱跳问题的解决办法
- 关于chrome控制台警告:Synchronous XMLHttpRequest on the main thread终极解决办法
- 折腾opencv svm 而想到的
- HDU贪心题解
- Vector sort 用法
- Thread方法解释(join,sleep,yield,interrupt)
- 三层架构理论篇
- JQueryEasyUI 组件dialog
- redirect和forward的比较
- centOs7安装redis
- Dagger2使用教程
- CodeForces 498D Traffic Jams in the Land
- bzoj 3451
- 资料收集