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