线程让位与线程合并
一、线程让位
Thread.yield();/是让当前线程赞停回到就绪状态,让给其他线程先执行,等执行之结束再继续执行
我们写个例子,一个t线程一个main线程,我们分别让两个线程循环打印10000个数字。让t线程每隔1000个让位一次。
代码示例:
public class ThreadTest12 {
public static void main(String[] args) {
Thread thread=new Thread(new Thread12());
thread.setName("t");
thread.start();
for (int i = 1; i <= 10000; i++) {
System.out.println(Thread.currentThread().getName()+"----->"+i);
}
}
}
class Thread12 implements Runnable{
@Override
public void run() {
for (int i = 1; i <= 10000; i++) {
//每1000个让位一次
if (i % 1000 == 0) {
Thread.yield();//当前线程暂停一下
}else {
System.out.println(Thread.currentThread().getName() + "----->" + i);
}
}
}
}
输出结果:
二、线程合并(等待线程死亡)
join是合并到一个线程,也可以说是等待线程死亡!为什么这么说呢?
例如,我们有一个t线程一个main线程。当我们把t线程合并到main线程中去,t线程限制性,等t线程执行之后继续执行main线程。那么t线程执行之后就是死亡,相当于是等待t线程死亡。只是这个线程是正常死亡的。
而如果给join后面跟一个参数,就是等待线程死亡的时间,我们可以这样理解,其他线程等合并进来的线程死亡,默认是等它执行结束,加时间参数话就是等它这个时间参数,过了这个时间参数,就不再等它死亡!
先看一下不加参数的时候,线程的合并
代码示例:
package com.thread;
public class ThreadTest13 {
public static void main(String[] args) {
System.out.println("begin");
Thread t=new Thread(new Thread13());
t.setName("t");
t.start();
System.out.println("main");
//合并线程
try {
t.join();//t合并到当前线程,当前线程受阻塞,t执行,直到t执行结束
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main over");
System.out.println("end");
}
}
class Thread13 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
System.out.println(Thread.currentThread().getName()+"--->"+i);
}
}
}
输出:
可以看出是当t线程执行完之后main线程开始执行
现在我们给join加上时间参数,看是不是只等待这个时间参数里面的时间,因为现在电脑运行过快,所以我们把时间设置为1毫秒
只需要把上面代码的这一行改一下即可
t.join(1);
输出:
本文来自博客园,作者:星余明,转载请注明原文链接:https://www.cnblogs.com/lingstar/p/16534433.html