• Java连载106-sleep方法以及中断方式、yield方法


    一、多线程的sleep方法

    1.Thread.sleep(毫秒)

    2.sleep方法是一个静态方法

    3.该方法的作用:阻塞当前线程,腾出CPU,让给其他线程

    4.sleep的异常注意事项,以及中断休眠的一种方式及其注意点

    package com.bjpowernode.java_learning;
    
     
    
    public class D106_1_ {
    
      public static void main(String[] args) throws InterruptedException{
    
        Processer106 p1 = new Processer106();
    
        p1.start();
    
        //需求:子线程启动后0.5s之后打断它的休眠
    
        Thread.sleep(500);
    
        p1.interrupt();//这样就会是子线程打断休眠
    
        //这个底层的实现方法是一个调用中断异常的方式,因此,这个休眠之后的操作就不会执行了
    
        //在这个代码中就会直接进行下一次循环
    
        for(int i=0;i<5;i++) {
    
          System.out.println(Thread.currentThread().getName()+"---->"+i);
    
          //下面这个语句也可以使用对象.sleep();因为sleep方法是一个静态方法。
    
          //即p1.sleep(200);这个main线程也会休眠200ms
    
          Thread.sleep(200);
    
        }
    
      }
    
    }
    
    class Processer106 extends Thread{
    
      //Thread中的run方法不抛出异常,因此重写run方法,在run方法的声明位置不能使用throws
    
      //所以run方法中只能使用try...catch.....
    
      public void run() {
    
        for(int i=0;i<5;i++) {
    
         
    
          System.out.println(Thread.currentThread().getName()+"--->"+i);
    
          try {
    
            Thread.sleep(1000);//当前线程阻塞1s
    
            System.out.println(i);
    
          }catch(InterruptedException e) {
    
            e.printStackTrace();
    
          }
    
        }
    
      }
    
      //m1方法是可以使用throws的
    
    }

    二、如何正确的停止一个线程(不使用interrupt方法)

    使用一个flag就可以达到我们的目的

     
    
    package com.bjpowernode.java_learning;
    
     
    
    public class D106_2_InterruptSleep {
    
      public static void main(String[] args) throws Exception{
    
        Processer106_2 p = new Processer106_2();
    
        Thread t = new Thread(p);
    
        t.setName("t");
    
        t.start();
    
        //5s之后终止
    
        Thread.sleep(5000);
    
        p.run1 = false;
    
        //这种非异常的方法更好,因为不会抛出异常。
    
         
    
      }
    
     
    
    }
    
    class Processer106_2 implements Runnable{
    
     
    
      boolean run1 = true;
    
     
    
      public void run() {
    
        for(int i=0;i<10;i++) {
    
          if(run1) {
    
            try {
    
              Thread.sleep(1000);
    
            }catch(InterruptedException e) {
    
              e.printStackTrace();
    
            }
    
            System.out.println(Thread.currentThread().getName()+"-->"+i);
    
          }else {
    
            return;
    
          }
    
         
    
        }
    
      }
    
    }

    三、Thread.yield

    1.该方法是一个静态方法

    2.作用:给同一个优先级的线程让位,但是让位时间不固定

    3.和sleep方法相同,就是yield时间不固定

    package com.bjpowernode.java_learning;
    
     
    
    public class D106_3_ThreadYield {
    
      public static void main(String[] args) throws InterruptedException  {
    
        Processer106_3 p = new Processer106_3();
    
        Thread t = new Thread(p);
    
        t.setName("t");
    
        t.start();
    
        //在主线程中
    
        for(int i=0;i<1000;i++) {     
    
          System.out.println(Thread.currentThread().getName()+"-->"+i);
    
        } 
    
      }
    
    }
    
    class Processer106_3 implements Runnable{
    
      public void run() {
    
        for(int i=0;i<1000;i++) {
    
          System.out.println(Thread.currentThread().getName()+"-->"+i);
    
          if(i%20 == 0) {
    
            Thread.yield();
    
          }
    
        }
    
      }
    
    }

     

    四、源码:

    D106_1_SleepMehthodAnalysis.java

    D106_2_InterruptSleep.java

    D106_3_ThreadYield.java

    https://github.com/ruigege66/Java/blob/master/D106_1_SleepMehthodAnalysis.java

    https://github.com/ruigege66/Java/blob/master/D106_2_InterruptSleep.java

    https://github.com/ruigege66/Java/blob/master/D106_3_ThreadYield.java

    2.CSDN:https://blog.csdn.net/weixin_44630050

    3.博客园:https://www.cnblogs.com/ruigege0000/

    4.欢迎关注微信公众号:傅里叶变换,个人公众号,仅用于学习交流,后台回复”礼包“,获取大数据学习资料

     

  • 相关阅读:
    一周优化内存、查询速度小结
    三种不同的方式,计算欧氏距离,速度比较
    三种不同的方式,计算欧氏距离,速度比较
    多线程与多进程
    匹配错误分析
    fasttext与Linear SVC 分类测试结果
    什么是闭包
    智能客服功能页面
    客服培训
    约当产量法
  • 原文地址:https://www.cnblogs.com/ruigege0000/p/12640147.html
Copyright © 2020-2023  润新知