暂停线程执行sleep_yield_join_stop

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 }
View Code

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 }
View Code
 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 }
View Code

-------------------------------------------------------------------------------------------------------------------

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 }
View Code
 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 }
View Code

--------------------------------------------------------------------------------------------------

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 }
View Code
 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 }
View Code

总结

1.sleep

不会释放锁,Sleep时别的线程也不可以访问锁定对象。

2.yield:

让出CPU的使用权,从运行态直接进入就绪态。让CPU重新挑选哪一个线程进入运行状态。

3.join:

当某个线程等待另一个线程执行结束后,才继续执行时,使调用该方法的线程在此之前执行完毕,也就是等待调用该方法的线程执行完毕后再往下继续执行

posted @ 2019-04-02 13:27  北风吹沙  阅读(490)  评论(0编辑  收藏  举报