• 多线程学习(五)


    join

    一个线程上调用另一个线程,其效果是等待一段时间直到第二个线程结束才继续执行.也可以在join()加一个超时的参数,这样在这段时间到期还没有结束的话,join总能返回。
    如果在一个线程中调用t.join(),那么此线程将被挂起直到t运行结束才恢复:

    public class Sleeper extends Thread {
    	private int duration;
    
    	public Sleeper(String threadName, int duration) {
    		super(threadName);
    		this.duration = duration;
    		start();
    	}
    
    	@Override
    	public void run() {
    		try {
    			sleep(duration);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    //			e.printStackTrace();
    			System.out.println("sleeper:"+getName()+" is interrupted");
    			return;
    		}
    		System.out.println("sleeper:"+getName()+" has awakened");
    	}
    
    }
    
    public class Jioner extends Thread {
    	private Sleeper sleeper;
    
    	public Jioner(Sleeper sleeper, String threadName) {
    		super(threadName);
    		this.sleeper = sleeper;
    		start();
    	}
    
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		try {
    			sleeper.join();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			// e.printStackTrace();
    			System.out.println("joiner:" + getName() + " is interrupted");
    		}
    		System.out.println("joiner:" + getName() + " completed");
    	}
    
    	public static void main(String[] args) {
    		Sleeper s1 = new Sleeper("s1", 15000), s2 = new Sleeper("s2", 15000);
    		Jioner j1 = new Jioner(s1, "j1"), j2 = new Jioner(s2, "j2");
    		s1.interrupt();
    	}
    }
    

    输出:
    sleeper:s1 is interrupted
    joiner:j1 completed
    sleeper:s2 has awakened
    joiner:j2 completed
    可以看出joiner没有自己直接运行结束而是等待sleeper线程运行完成之后才继续运行至结束。

    题外话:这个join的具体用处可以在 A、B、C三个线程必须按照abc这样的顺序执行的时候运用。(C.join B 、 B.join A) 这也是一个经典的java多线程面试题目:如何让abc三个线程按照顺序执行?答案可能有很多,最简单的是用join来实现。我在阿里一面的时候被问到了,我当时答得是什么破玩意。 现在才知道答案还不算太晚。

    线程组

    这个不推荐使用:
    think in java 中:

  • 相关阅读:
    8月6日总结
    8月4日总结
    8月3日总结
    快速幂计算题解
    7月31日总结
    7月30日总结
    关于PHP中”::”能够调用一个非静态的方法的解释
    码云 使用 svn 管理项目
    Mysql的数据类型
    thinkphp5的$this->fetch()
  • 原文地址:https://www.cnblogs.com/joeCqupt/p/6816754.html
Copyright © 2020-2023  润新知