1.final void join() 调用该方法的线程强制执行完成,其它线程处于阻塞状态,该线程执行完毕,其它线程再执行
1 public class TestJoin { 2 public static void main(String[] args) throws InterruptedException { 3 //主线程 4 MyThread my=new MyThread(); 5 Thread t=new Thread(my); 6 Thread t2=new Thread(my); 7 //启动线程 8 t.start(); 9 t2.start(); 10 //以下代码为主线程中的循环 11 for(int i=0;i<5;i++){ 12 if(i==2){ 13 t.join(); //t线程强制执行 14 } 15 System.out.println("------------"+Thread.currentThread().getName()+"-------->"+i); 16 } 17 } 18 /** 19 * 导致调用它的线程进入阻塞状态,而不会导致其它的线程 20 * 21 * */ 22 }
main执行到2进入阻塞,等Thread-0和Thread-1执行完毕
--------------------------------------------------------------------------------------------------------------
2.static void sleep(long millis) 使当前正在执行的线程休眠millis毫秒,线程处于阻塞状态
1 public class MyThread2 implements Runnable { 2 @Override 3 public void run() { 4 try { 5 System.out.println("MyThread2.run(),线程开始休眠"); 6 Thread.sleep(3000);//休眠3秒 7 System.out.println("MyThread2.run(),休眠结束"); 8 } catch (InterruptedException e) { 9 System.out.println("MyThread2.run(),产生异常"); 10 } 11 } 12 }
1 public class TestSleep2 { 2 /** 3 * sleep方法会导致线程进入阻塞,写在哪个线程体中就会导致哪个线程进入阻塞状态*/ 4 public static void main(String[] args) throws InterruptedException { 5 MyThread2 my=new MyThread2(); 6 Thread t=new Thread(my); 7 //启动线程 8 t.start(); 9 //以下代码为主线程中的代码 10 System.out.println("主线程开始休眠"); 11 Thread.sleep(2000); 12 System.out.println("主线程休眠结束"); 13 } 14 }
-------------------------------------------------------------------------------------------------------------------
3.static void yield() 当前正在执行的线程暂停一次(礼让),允许其他线程执行,不阻塞,线程进入就绪状态,如果没有其他等待执行的线程,这个时候当前线程就会马上恢复执行
1 public class MyThread3 implements Runnable { 2 @Override 3 public void run() { 4 for(int i=0;i<5;i++){ 5 if(i==2){ 6 Thread.yield();//i==2时礼让一次 7 System.out.println("当前线程:"+Thread.currentThread().getName()+"线程礼让一次"); 8 } 9 System.out.println("i="+i); 10 } 11 } 12 }
1 public class TestYield { 2 public static void main(String[] args) { 3 MyThread3 my=new MyThread3(); 4 new Thread(my).start();//启动线程 5 //主线程中的循环 6 for(int i=0;i<5;i++){ 7 if(i==3){ 8 Thread.yield();//i==3 主线程礼让一次 9 System.out.println(Thread.currentThread().getName()+"线程礼让一次"); 10 } 11 System.out.println(Thread.currentThread().getName()+"------------"+i); 12 } 13 } 14 }
--------------------------------------------------------------------------------------------------
4.final void stop() 强迫线程停止执行,已过时,不推荐使用
1 public class MyThread4 implements Runnable { 2 @Override 3 public void run() { 4 for(int i=0;i<5;i++){ 5 System.out.println("i="+i); 6 } 7 } 8 }
1 public class TestStop { 2 public static void main(String[] args) { 3 MyThread4 my=new MyThread4(); 4 Thread t=new Thread(my); 5 t.start();//启动线程 6 //主线程中的循环 7 for(int i=0;i<5;i++){ 8 if(i==2){ 9 t.stop(); //已过时,不建议使用 10 } 11 System.out.println(Thread.currentThread().getName()+"--->"+i); 12 } 13 14 } 15 }
总结
1.sleep:
不会释放锁,Sleep时别的线程也不可以访问锁定对象。
2.yield:
让出CPU的使用权,从运行态直接进入就绪态。让CPU重新挑选哪一个线程进入运行状态。
3.join:
当某个线程等待另一个线程执行结束后,才继续执行时,使调用该方法的线程在此之前执行完毕,也就是等待调用该方法的线程执行完毕后再往下继续执行