Thread实现多线程二
接上文,关系到线程运行状态的几个方法:
4)yield方法
调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。它跟sleep方法类似,同样不会释放锁。但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。
注意,调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,这一点是和sleep方法不一样的。
5)join方法
join方法有三个重载版本:1
2
3join()
join(long millis) //参数为毫秒
join(long millis,int nanoseconds) //第一参数为毫秒,第二个参数为纳秒
假如在main线程中,调用thread.join方法,则main方法会等待thread线程执行完毕或者等待一定的时间。如果调用的是无参join方法,则等待thread执行完毕,如果调用的是指定了时间参数的join方法,则等待一定的事件。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33import java.io.IOException;
public class ThreadJoin {
public static void main(String[] args) throws IOException {
System.out.println("进入线程" + Thread.currentThread().getName());
ThreadJoin test = new ThreadJoin();
MyThread thread1 = test.new MyThread();
//线程开始
thread1.start();
try {
System.out.println("线程 " + Thread.currentThread().getName() + "等待");
thread1.join();//使主线程进入等待,其他线程执行完毕
System.out.println("线程" + Thread.currentThread().getName() + "继续执行");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class MyThread extends Thread{
public void run() {
System.out.println("进入线程" + Thread.currentThread().getName());
try {
Thread.currentThread().sleep(5000);
} catch (InterruptedException e) {
// TODO: handle exception
}
System.out.println("线程" + Thread.currentThread().getName()+"执行完毕");
}
}
}
执行结果 :1
2
3
4
5进入线程main
线程 main等待
进入线程Thread-0
线程Thread-0执行完毕
线程main继续执行
可以看出,当调用thread1.join()方法后,main线程会进入等待,然后等待thread1执行完之后再继续执行。
实际上调用join方法是调用了Object的wait方法 。