欢迎光临散文网 会员登陆 & 注册

java线程中yield()方法、join()方法

2022-08-31 13:57 作者:虚云幻仙  | 我要投稿

/**
* 线程中yield()方法、join()方法
* yield让位,yield()方法会使当前线程将cpu资源让位给同优先级的线程,yield()方法不能保证线程立刻从运行状态变为就绪状态/可运行状态,yield不会使线程变为阻塞状态
*/

public class Test4Thread implements Runnable{
   @Override
   public void run() {
       for (int i=0;i<8;i++){
           Thread.yield();
           System.out.println(Thread.currentThread().getName()+"执行次数:"+i);
       }
   }

   public static void main(String[] args) {
       new Thread(new Test4Thread()).start();
       new Thread(new Test4Thread()).start();
       /*结果为:
       Thread-0执行次数:0
       Thread-1执行次数:0
       Thread-0执行次数:1
       Thread-1执行次数:1
       Thread-0执行次数:2
       Thread-1执行次数:2
       Thread-0执行次数:3
       Thread-1执行次数:3
       Thread-1执行次数:4
       Thread-0执行次数:4
       Thread-1执行次数:5
       Thread-0执行次数:5
       Thread-1执行次数:6
       Thread-0执行次数:6
       Thread-1执行次数:7
       Thread-0执行次数:7

       子线程每一次执行到yield()会尝试让位给另一个子线程,并且在下一次进入运行状态时会执行yield()下面的语句,每轮循环都会执行一次yield()让位
       预期是每个子线程打印一次循环后让位给另一个子线程,两个子线程交替打印
       但存在让位不成功的情况,比如Thread-1连着执行了3和4
        */

   }
}

class Test5Thread implements Runnable{
   //测试join()线程联合,联合的线程会从并行变为串行
   public static void main(String[] args) {
       Thread t = new Thread(new Test4Thread());
       t.start();
       try {
           t.join();
           //在主线程中调用了t.join()方法, 主线程 会进入阻塞状态,等待子线程t执行完毕后再往后执行,相当于将t的过程join进了main的时间轴中
       } catch (InterruptedException e) {
           throw new RuntimeException(e);
       }
       System.out.println("主线程结束");
       /*
       Thread-0执行次数:0
       Thread-0执行次数:1
       Thread-0执行次数:2
       Thread-0执行次数:3
       Thread-0执行次数:4
       Thread-0执行次数:5
       Thread-0执行次数:6
       Thread-0执行次数:7
       主线程结束

       主线程与子线程联合后,子线程的yield()不起作用,如果有其他线程并行执行的话其他线程不受影响
        */


   }


   @Override
   public void run() {
       //在子线程中联合线程
       Thread t = new Thread(new Test4Thread());
       //在子线程中创建线程
       try {
           t.join();
           //创建线程的一方联合被创建的线程
       } catch (InterruptedException e) {
           throw new RuntimeException(e);
       }
       System.out.println("等待被创建的线程结束,创建方再向下执行");
   }
}

java线程中yield()方法、join()方法的评论 (共 条)

分享到微博请遵守国家法律