Java多线程:start(),sleep(),yield(),join()

     Java多线程:start(),sleep(),yield(),join()由广州疯狂软件教育java培训分享:

  1.start()和run()

  执行的线程,一定要调用它的start()方法。不能调用run()方法。

  如果直接调用线程对象的run()方法,程序也会执行,但那样是在当前线程中执行,不会启动新的线程。

  start()方法的本质是从CPU中申请一个新的线程空间来执行 run()方法中的代码。

  run()方法的本质是只是线程的接口回调方法。

  一个线程对象只能运行成功一次start()方法,即已经调用start()方法的对象不能再次调用start()方法,否则会抛异常。

  2.sleep()

  sleep()是静态方法,使正在运行的线程进入阻塞状态。

  睡眠时间到了,会进入就绪状态。

  sleep()方法声明抛出了InterruptedException

  在sleep 时间间隔期满后,线程不一定立即恢复执行,即:

  Thread.sleep(1000)使得线程睡眠1秒,可能结果会大于1秒

  除非:

  a.醒来的线程具有更高的优先级。

  b.正在运行的线程因为其它原因而阻塞。

  所以:

  程序员只能最大限度的影响线程执行的次序,而不能做到精准控制。

  sleep()方法是静态方法,只对正在运行状态的线程对象有效。如:

  public class TestThread {

  public static void main(String[] args) throws InterruptedException {

  System.out.println(Thread.currentThread().getName());

  Thread threadNew=new Thread();

  threadNew.start();

  //这里是主线程sleep,而不是threadNew线程

  threadNew.sleep(1000);

  System.out.println(Thread.currentThread().getName());

  Thread.sleep(10);

  for(int i=0;i<100;i++){

  System.out.println("main"+i);

  }

  }

  }

  3.yield()

  yield()是静态方法,使正在运行的线程进入就绪状态。

  yield()方法声明没有抛出异常。

  yield()方法是让系统的线程调度器重新调度当前线程。

  可能:

  当某个线程调用yield()方法之后,线程调度器又将其调度出来重新进入到运行状态执行。

  通常不用yield()方法,而用sleep()方法。

  4.join()

  将几个并行线程的线程合并为一个单线程执行,

  应用场景是当一个线程必须等待另一个线程执行完毕才能执行时,

  它不是静态方法。

  它有3个重载的方法:

  void join()

  当前线程等该加入该线程后面,等待该线程终止。

  void join(long millis)

  当前线程等待该线程终止的时间最长为 millis 毫秒。 如果在millis时间内,该线程没有执行完,那么当前线程进入就绪状态,重新等待cpu调度

  void join(long millis,int nanos)

  等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。如果在millis时间内,该线程没有执行完,那么当前线程进入就绪状态,重新等待cpu调度

  public class Test1 {

  public static void main(String[] args) throws InterruptedException {

  MyThread thread=new MyThread();

  thread.start();

  thread.join(1);//将主线程加入到子线程后面,不过如果子线程在1毫秒时间内没执行完,则主线程便不再等待它执行完,进入就绪状态,等待cpu调度

  for(int i=0;i<30;i++){

System.out.println(Thread.currentThread().getName() + "线程第" + i + "次执行!");

  }

  }

  }

  class MyThread extends Thread {

  @Override

  public void run() {

  for (int i = 0; i < 1000; i++) {

  System.out.println(this.getName() + "线程第" + i + "次执行!");

  }

  }

  }

  在这个例子中,在主线程中调用thread.join(); 就是将主线程加入到thread子线程后面等待执行。不过有时间限制,为1毫秒。

  疯狂Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。技术知识沉淀深厚的老师,让你感受Java的魅力,激发你对于编程的热爱,让你在半年的时间内掌握8-10万的代码量,掌握Java核心技术,成为真正的技术高手;通过大量全真企业项目疯狂训练,迅速积累项目经验。让你成为技能型的现代化高端人才,迅速获得高薪就业!时间不等人,赶紧联系我们吧!疯狂java培训中心地址:广州天河区车陂沣宏大厦3楼。

转载于:https://www.cnblogs.com/gojava/p/3656144.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值