当前位置: 移动技术网 > IT编程>开发语言>Java > Java连载106-sleep方法以及中断方式、yield方法

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

2020年04月06日  | 移动技术网IT编程  | 我要评论

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

 

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网