ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 一、join 用于在某一个线程的执行过程中调用另一个线程执行,等到被调用的线程执行结束后,再继续执行当前线程。 在线程t2的代码中加入t1.join(),就是让t1这个线程先运行完,让t2这个线程暂时挂起不运行 ``` public static void main(String[] args) { Thread t1 = new Thread(() -> { System.out.println("线程1开始运行!"); for (int i = 0; i < 50; i++) { System.out.println("1打印:"+i); } System.out.println("线程1结束!"); }); Thread t2 = new Thread(() -> { System.out.println("线程2开始运行!"); for (int i = 0; i < 50; i++) { System.out.println("2打印:"+i); if(i == 10){ try { System.out.println("线程1加入到此线程!"); t1.join(); //在i==10时,让线程1加入,先完成线程1的内容,在继续当前内容 } catch (InterruptedException e) { e.printStackTrace(); } } } }); t1.start(); t2.start(); } ``` **需要注意的是,在t1未加入到t2的时候,这两个线程是并发执行,而执行到t1.join时,就让t1这个线程先运行完毕,此时只剩t2这个线程,执行完毕,程序结束** ## 二、yield yield是将当前线程的cpu时间块让给其他线程(注意,虽然这个线程让出了自己的时间块,但是有可能该线程会被再次选中) 引用他人博客的解释,就是:yield关键字的作用是让出当前线程的执行权,增加其他线程被选中的概率,提高线程的执行效率和公平性。 ``` public static void main(String[] args) { Thread t1 = new Thread(() -> { System.out.println("线程1开始运行!"); for (int i = 0; i < 50; i++) { if(i % 5 == 0) { System.out.println("让位!"); Thread.yield(); } System.out.println("1打印:"+i); } System.out.println("线程1结束!"); }); Thread t2 = new Thread(() -> { System.out.println("线程2开始运行!"); for (int i = 0; i < 50; i++) { System.out.println("2打印:"+i); } }); t1.start(); t2.start(); } ``` ## 三、总结 join: 挂起当前线程,让t1.join()这个t1线程先运行结束 yield:本来到这个线程执行了,但是执行了Thread.yield(),就让这个占用cpu的线程处于就绪态,让系统重新选择一个线程占用cpu