一、sleep方法
1.调用 sleep 会让当前线程从 Running 进入TIMED_WAITING状态,但是不会释放对象锁
2.其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出InterruptedException,并且会清除中断标志 ,此时要在finally代码块中重新设置中断标志位hread.currentThread().interrupt();
3.sleep当传入参数为0时,和yield一样可以释放时间片,让进程进入Runnable状态。
二、yield方法
yield会释放CPU资源,让当前线程从 Running 进入 Runnable状态,让优先级更高(或者相同)的线程获得执行机会,但是不会释放对象锁。 比如ThreadA调用yiled方法后,他会优先执行。
三、join方法
等待调用join方法的线程结束之后,程序再继续执行。
比如如下代码:
package com.spj.peng;
public class ThreanJoinTest {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(new Runnable() {
public void run() {
System.out.println("t begin");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t finished");
}
});
long start = System.currentTimeMillis();
t.start();
//主线程等待线程t执行完成
//t.join();
System.out.println("执行时间:" + (System.currentTimeMillis() - start));
System.out.println("Main finished");
}
}
假如没有join方法主线程不会等待t线程先执行完,而是先执行自己的。
而若加入join方法后主线程会先等待t线程执行完在执行
四、stop方法
stop()方法会释放对象锁, 强行把执行到一半的线程终止。比如A线程执行到一半的时候调用stop()方法的话,则会将该线程强行终止并且释放锁,让其他线程执行,这样问题就来了,A线程
剩下的一半业务还没执行完,若该业务很主要,则会出现很严重的问题。
因此一般终止线程的时候,都尽量用interrupt来终止线程:通过interrupt中断机制不会直接终止另一个线程,而需要被中断的线程自己处理。被中断的线程拥有完全的自主权,它既可以选择立即停止,也可以选择一段时间后停止,也可以选择不停止。这样就可以保证线程安全。