1、join:线程插队
Thread th=new Thread(//创建线程
()->{
for(int j=0;j<100;j++){
System.out.println("线程2:"+j);
}
}
);
th.start();//启动线程
for(int i=0;i<100;i++){
System.out.println("主线程:"+i);
if(i==20){//设置条件join线程
try {
th.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果是,开始时两个线程相互输出,当主线程的 i 增加到20 ,join了线程2 ,这时,主线程阻塞,线程2执行结束,主线程继续执行 ,假如有三个线程,暂时称为1、2、3,同时运行着,这时,在1线程运行中,调用了线程二的join方法,这时,则线程一阻塞,线程二三一起运行,直到被join的线程二运行结束,线程一才继续运行,期间,线程三一直运行,直到结束,不受影响。 这也符合线程之间互不影响的原则。join()方法通常由使用线程的程序调用,以将大问题划分成许多小文题,每个小问题分配一个线程。当所有的小问题都得到处理后,再调用主线程来进一步操作。
-
join()的三种重载方法
1、 join(); 等待被join的线程执行结束
2、 join(long millis) :等待mills毫秒,让被join的线程先执行着
3、3、join(long millis,int nanos):等待被join的线程的时间最长为mills毫秒加nanos毫微秒。一般不使用,最常用的时1和2.
2、sleep:线程睡眠
想让正在执行的程序暂停一段时间,进入阻塞状态,就可以体通过Thread类中的 静态方法sleep()来实现
两种重载形式
-
sleep(long millis),当前线程停止mills毫秒 sleep(long millis,int
-
nanos),当前线程停止mills毫秒加nanos毫微秒,一般不用。
注意传入的参数是long 类型的数,表示毫秒
3、yield:线程让步
Thread中的一个静态方法,没有要声明或抛出的异常
让当前线程暂停,让系统的线程的调度器重新调度一次,完全有可能,重新调度以后,又执行到该线程,所以效果一般不是很明显,
- 和sleep方法不同,线程睡眠之后,任何一个线程都可以拥有调度的机会,但是,线程让步之后只有线程优先级大于等于该线程优先级的线程才可能被执行
- 这个方法不会讲线程转入阻塞状态,而是而是强制其进入就绪状态。
- sleep方法具有更好的可移植性,
- yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。
4、Priority:线程优先级
Thread提供类两个方法,改变线程的优先级
- setPriority(int new Priority)设置线程的优先级
- getPriority()返回线程的优先级
线程的优先等级是一个整数,范围是1~10之间,也可以使用Thread中的三个常量
MAX_PRIORITY其值为10
MIN_PRIORITY其值为1
NORM_PRIORITY其值为5
优先级表示的是线程调度时,被执行到的概率,不是一个准确的值 - Java中的十个优先级并不能与所有的操作系统中的级别一一对应,所以设置优先级大小时,尽量考虑使用三个常量,增加可移植性。