欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-18 18:47:15
一、多线程的sleep方法 1.Thread.sleep(毫秒) 2.sleep方法是一个静态方法 3.该方法的作用:阻塞当前线程,腾出CPU,让给其他线程 4.sleep的异常注意事项,以及中断休眠的一种方式及其注意点 package com.bjpowernode.java_learning; ......

一、多线程的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的

}

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

二、如何正确的停止一个线程(不使用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;

      }

     

    }

  }

}

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

三、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();

      }

    }

  }

}

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

 

 Java连载106-sleep方法以及中断方式、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.欢迎关注微信公众号:傅里叶变换,个人公众号,仅用于学习交流,后台回复”礼包“,获取大数据学习资料

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