一、合并线程Join
- 如果某个线程在另一个线程上调用join(),此线程将被挂起(阻塞),直到调用的线程结束才恢复。
- 也可以在调用join()时带上一个超时参数(单位可以是毫秒,或者毫秒和纳秒),这样如果目标线程在这段时间到期时还没有结束的话,join()方法总能返回。
package Thread;
public class JoinDemo01 extends Thread {
public static void main(String[] args) throws InterruptedException {
JoinDemo01 demo = new JoinDemo01();
Thread th = new Thread(demo);
th.start();//就绪
//cpu调度就运行
for(int i = 0 ;i<10;i++) {
if(5==i) {
th.join(); //mian阻塞
}
System.out.println("main......"+i);
}
}
@Override
public void run() {
for(int i = 0 ;i<10;i++) {
System.out.println("join......"+i);
}
}
}
在main主线程中调用了 其他线程的join方法,main线程就堵塞 ,直到其他线程运行完了,才运行。
二、暂停线程vield
暂停自己的线程,是一个静态的方法
package Thread;
public class YieldDemo extends Thread{
public static void main(String[] args) throws InterruptedException {
YieldDemo demo = new YieldDemo();
Thread th = new Thread(demo);
th.start();//就绪
//cpu调度就运行
for(int i = 0 ;i<10;i++) {
if(5==i) {
//暂挺本线程main
Thread.yield();
}
System.out.println("main......"+i);
}
}
@Override
public void run(){
for(int i = 0 ;i<10;i++) {
System.out.println("yield......"+i);
}
}
}
在那个线程调用了 vield方法 就暂停该线程
三、sleep 休眠 不释放锁
1)与时间相关 倒计时
2)模拟网络延迟
package Thread;
public class SleepDemo {
/*
* 倒计时 10个数 一秒打印一个
*/
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
int num =10;
while(true) {
System.out.println(num--);
Thread.sleep(1000);//暂停
if(num<0) {
break;
}
}
}
}
效果图
package Thread;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SleepDemo {
public static void main(String[] args) throws InterruptedException {
Date endTime = new Date();
long end = endTime.getTime();
while(true) {
System.out.println(new SimpleDateFormat("mm:ss").format(endTime));
endTime = new Date(endTime.getTime()-1000);
Thread.sleep(1000);
if(end-10000>endTime.getTime()) {
break;
}
}
}
}
效果图