join线程
join()方法:一个线程等待另一个线程完成,当某个程序执行流中调用其它线程的join()方法时,调用线程将被阻塞,直到join()方法加入的join线程执行完为止。
public class joinTest extends Thread{
public joinTest(String name){
super(name);}public void run(){
for(int i=0;i<100;i++){
System.out.println(getName()+" "+i);}}public static void main(String[] args)throws Exception {
new joinTest("新线程").start();//启动“新线程”for(int i=0;i<100;i++){
if(i==20){
//Join线程会阻塞main线程,但和新线程并发执行joinTest jt=new joinTest("Join线程" );jt.start();jt.join();//“Join线程”调用join()方法,阻塞调用它的main线程}System.out.println(Thread.currentThread().getName()+" "+i);}}
}
结果分析:
//开始执行新线程
新线程 0
......
新线程 24
//开始执行main线程,main线程和新线程交替执行
main 0
...
main 11
新线程 25
main 12
......
新线程 34
//i=20,Join线程开始执行,main线程被阻塞,Join线程和新线程交替执行
Join线程 0
新线程 35
Join线程 1
新线程 36
......
Join线程 99
//join线程结束,main线程继续执行
main 20
......
main 99
join()方法另外两种重载方式:
后台线程
public class DaemonThread extends Thread{
public void run(){
for(int i=0;i<1000;i++)System.out.println(getName()+" "+i);}public static void main(String[] args) {
DaemonThread t=new DaemonThread();System.out.println(t.isDaemon());//判断是否为后台线程:falset.setDaemon(true);//设置为后台线程,并且必须在start()前调用该方法System.out.println(t.isDaemon());//判断是否为后台线程:truet.start();for (int i=0;i<10;i++)System.out.println(Thread.currentThread().getName()+" "+i);//调用main线程//main线程执行结束,t也随之结束}
线程睡眠
线程让步
public class YieldTest extends Thread {
public YieldTest(String name){
super(name);}public void run(){
for(int i=0;i<50;i++){
System.out.println(getName()+" "+i);if(i==20)Thread.yield();}}public static void main(String[] args) {
//启动两个线程YieldTest yieldTest1=new YieldTest("高级线程:");//yieldTest1.setPriority(Thread.MAX_PRIORITY);yieldTest1.start();YieldTest yieldTest2=new YieldTest("低级线程:");//yieldTest2.setPriority(Thread.MIN_PRIORITY);yieldTest2.start();}
}
调用yield()方法,线程的调用顺序和线程优先级有关。在多cpu并行环境下,yield()方法的功能并不明显。
sleep()和yield()的区别:
线程优先级