线程的控制:
Java中的线程支持提供了一些便捷的工具方法,通过这些便捷的工作方法可以更好的控制线程的执行。
一、join线程:
Thread提供了让一个线程等待另一个线程完成的方法——join()方法。当某个程序执行流中调用其他线程的join方法时,调用线程将被阻塞,直到被join方法加入的join线程执行完为止。
Join()方法有如下3种重载形式:
1、join():等待被join的线程执行完成。
2、join(long millis):等待被join的线程的时间最长为millis 毫秒,如果在millis 毫秒内被join 的线程还没有执行结束,则不再等待。
3、Join(long millis , int nanos):等待被join的线程的时间最长为millis 毫秒加nanos 毫微秒。
1 public class JoinThread extends Thread{ 2 private int i; 3 public void run(){ 4 for(;i<30;i++){ 5 try{sleep(1000); 6 System.out.println("线程的名字:"+getName()+" "+i);}catch(Exception e){ 7 System.out.println(e); 8 } 9 } 10 } 11 public static void main(String[] args){ 12 JoinThread j=new JoinThread(); 13 for(int k=0;k<100;k++){ 14 try{ 15 Thread.sleep(1000); 16 System.out.println("当前线程的名字为:"+Thread.currentThread().getName()+" "+k); 17 }catch(Exception e){ 18 System.out.println(e); 19 } 20 if(k==5){ 21 j.start(); 22 } 23 if(k==10){ 24 try{j.join();}catch(Exception e){ 25 System.out.println(e); 26 } 27 } 28 } 29 } 30 }
二、interrupt方法中断线程:
stop()方法也是中断线程的方法,但是已经弃用了。
interrupt方法可以用来请求终止线程。
当对一个线程调用interrupt方法时,线程的中断状态将被置位。这时每个线程都具有的boolean 标志,每个线程都应该不时地检查这个标志,以判断线程是否被终端。
被中断的程序可以决定如何响应中断。
三、线程睡眠:sleep
如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread类的静态sleep()方法来实现。
当当前线程调用sleep()方法进入阻塞状态后,在其睡眠时间段内,该线程不会获得执行的机会,即使系统中没有其他可执行的线程,处于sleep中的线程也不会执行,因此sleep方法常用来暂停程序的执行。
四、线程的让步:yield
yield方法是一个和sleep方法有点相似的方法,它也是Thread类提供的一个静态方法,它也可以让当前正在执行的线程暂停,但它不会阻塞该线程,他只是让该线程转入就绪状态。Yield方法只是让当前的线程暂停一下,让系统的线程调度器重新调度一次。
总结一下yield和sleep方法的区别:
1、Sleep方法暂停但前线程后,会给其他线程执行机会,不会理会其他线程的优先级;但yield方法只会给优先级相同,或优先级更高的线程执行机会。
2、Sleep方法会将线程进入阻塞状态,知道经过阻塞时间才会转入就绪状态;而yield方法不会将线程转入阻塞状态,他只是强制当前线程进入就绪状态。
3、Sleep方法会抛出异常,而yield方法不会抛出异常。