Java多线程4--线程阻塞join、yield、sleep

1.join:合并线程

调用.join()时,其他线程要等该线程执行完毕后才执行

我们先新建个JoinDemo类

public class JoinDemo extends Thread{
	public static void main(String[] args) throws InterruptedException {
		
		JoinDemo jd= new JoinDemo();
		Thread t = new Thread(jd);//新生
		t.start();//就绪
		//CPU调度运行
		
		for(int i=0;i<1000;i++){
//一开始两个线程交替进行,当main=50时t.join(),等待t执行完再执行main
			if(i==50){
				t.join();//此时main方法阻塞,等待join执行完 
			}
			System.out.println("main..."+i);
		}
	}
	
		public void run() {
			for(int i=0;i<1000;i++){
				System.out.println("join..."+i);
			}
		}
}

这是运行结果的一部分截图

在main50之前,main和join交替执行,当i=50,main要等join执行完毕

2.yield:暂停自己的线程

用一个例子YieldDemo类来说明下

public class YieldDemo extends Thread{

	public static void main(String[] args) {
		YieldDemo yd =  new YieldDemo();
		Thread t = new Thread(yd);//新生
		t.start();//就绪
		
		for (int i= 0;i<1000;i++){
			/*i%20==0时
			 * 该线程就会把CPU时间让掉
			 * 让其他或者自己的线程执行
			 * (也就是谁先抢到谁执行)
			 */
			if(i%20==0){
				Thread.yield();//写在那个线程就暂停哪个
			}
			System.out.println("main..."+i);
		}

	}
	
	public void run(){
		for (int i=0;i<1000;i++){
			System.out.println("yield........"+i);
		}
	}

}

3.sleep:休眠(不释放锁)

     1)与时间相关:倒计时

     2)网络延时  

先建一个类来模拟倒计时

public class SleepDemo {

	public static void main(String[] args) throws InterruptedException {
		int num=10;
		while(true){
			System.out.println(num--);
			Thread.sleep(1000);//暂停
			if(num<=0){
				break;
			}
		}

	}

}

sleep(1000)即暂停一秒

接下来我们举一个购票的例子来讲一下网络延时,新建一个Web12306类

class Web12306 implements Runnable{
	private int num=50;
	public void run(){
		while (true){
			if(num<=0){
				break;//跳出循环
			}
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName()+"抢到了票,票还剩"+num--);
		}
	}
}

当票数小于等于0时退出循环

再建一个SleepDemo02类来实现

public class SleepDemo02 {

	public static void main(String[] args) {
		Web12306 web = new Web12306();//真实角色
		
		Thread t1=new Thread(web,"路人甲");//代理角色
		Thread t2=new Thread(web,"黄牛乙");
		Thread t3=new Thread(web,"攻城狮");
		
		t1.start();//启动线程
		t2.start();
		t3.start();

	}
}

猜你喜欢

转载自blog.csdn.net/qq_36986067/article/details/81293520