zoukankan      html  css  js  c++  java
  • 暂停线程执行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:

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

  • 相关阅读:
    (续)在深度计算框架MindSpore中如何对不持续的计算进行处理——对数据集进行一定epoch数量的训练后,进行其他工作处理,再返回来接着进行一定epoch数量的训练——单步计算
    YAML文件简介
    训练集验证集测试集的概念
    泛化误差
    drawio的打开方法
    移动硬盘无法被电脑识别
    r5 3600相当于英特尔什么级别
    Ubuntu WPS字体缺失配置
    pytorch深度学习cpu占用太高
    常用的架构设计原则-云原生架构设计快速入门
  • 原文地址:https://www.cnblogs.com/bfcs/p/10642085.html
Copyright © 2011-2022 走看看