一、sleep(毫秒数)方法
1、sleep方法是一个静态方法。
<span style="font-family:KaiTi_GB2312;font-size:24px;">public class ThreadTest extends Thread{
public static void main(String[] args){
ThreadTest thread=new ThreadTest();
thread.start();
try {
sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main线程被执行");
}
public void run(){
try {
sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("ThreadTest线程被执行");
}
}
</span>
输出结果:
ThreadTest线程被执行
main线程被执行
如果将sleep(10000)改为thread.sleep(10000)
public class ThreadTest extends Thread{
public static void main(String[] args){
ThreadTest thread=new ThreadTest();
thread.start();
try {
thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main线程被执行");
}
public void run(){
try {
sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("ThreadTest线程被执行");
}
}
输出结果:
ThreadTest线程被执行
main线程被执行
由以上可以看出,thread.sleep方法并不是休眠thread线程,而是休眠main线程。
sleep方法的执行不是取决于哪个线程通过“.”调用,而是在哪个线程中声明,在main方法中声明sleep或Thread.sleep休眠的是main线程,其他线程对象一般在run()方法中调用其sleep使该线程休眠。
2、线程进入休眠状态后,并没有释放所占用的CPU片段。sleep方法让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间。
3、sleep方法需捕获InterruptedException异常。线程在sleep过程中有可能被其他对象调用它的interrupt()方法,产生InterruptedException异常,如果程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态;如果程序捕获了这个异常,那么程序就会继续执catch语句块(可能还有finally语句块)以及以后的代码。
二、join()方法
1、一个线程调用join()方法,当前正在执行的线程被阻塞,直至调用join方法的线程执行完毕,当前线程才能继续执行。
public class Test {
public static class Thread_A extends Thread{
public void run(){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("A线程执行...");
}
}
public static void main(String[] args){
Thread_A a=new Thread_A();
a.start();
try {
a.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main线程执行...");
}
}
运行结果:
A线程执行...
main线程执行...
2、调用join()方法时可以带一个参数( join(long millis)
join(long millis, int nanos)
),目标线程在时间到期时,即使没有结束,join() 方法也返回,被挂起的线程恢复执行
3、对join()方法的调用可以被中断,做法是在调用线程上调用interrupt()方法,注意异常处理。