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

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

编码文章call10242025-06-07 13:32:234A+A-

/**

* 线程中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("等待被创建的线程结束,创建方再向下执行");

}

}

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4