一、多线程的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.欢迎关注微信公众号:傅里叶变换,个人公众号,仅用于学习交流,后台回复”礼包“,获取大数据学习资料

 

 

posted on 2020-04-06 00:26  心悦君兮君不知-睿  阅读(635)  评论(0编辑  收藏  举报