Java多线程中的加入字面意思就是加入或者合并,但是如果你在面试的时候这么说,那基本说明面试官还没有理解。 join到底能做什么呢?目前最常见的解释是在多线程环境中实现临时单线程执行,或者在并行执行环境中实现临时串行执行。让我们看一些非常常见的代码来说明这个问题。这段代码所做的就是分配三个线程来输出一份内容。
//代码块1 public class TestJoin { public static void main(String[] args) throws InterruptedException { Thread t1=new Thread(new DoSth()); Thread (new DoSth()); ()); System.out.println('运行主线程'); }}DoSth 类实现Runnable {. run () { int n=5; while (n 0) { System.out.println(Thread.currentThread().getName()); 尝试{ Thread.sleep(1) } catch (InterruptedException e); } n--; }}执行结果如下。
线程1 执行线程2 执行线程3 执行线程2 执行线程3 执行线程1 执行线程2 执行线程3 执行线程2 执行线程3 执行线程2 执行线程3 执行线程1 执行线程1 执行线程1 显示每个线程的执行情况有三个线程并行执行时没有明确的顺序。但是如果我在t.start() 之后添加这行代码,
//代码块2t1.start();t1.join(); 看看你看到了什么结果。
线程1 执行线程1 执行线程1 执行线程1 执行线程1 执行线程2 执行线程3 执行线程3 执行线程2 执行线程3 执行线程2 执行线程3 执行线程2 执行线程3 执行线程2 显示执行线程1。线程2和3执行完成后开始执行。可以看到线程1运行时没有其他线程在运行,线程2和线程3开始并行运行。底线,即: join 这个功能是为了在多线程环境下暂时运行在单线程中。一旦理解了这一点,下一个问题就是如何实现这个功能。遵循源代码。如你看到的。
//代码块3
公共最终同步无效连接(长毫秒)
抛出异常中止{
长基数=System.currentTimeMillis();
长=0;
if (millis 0) { throw new IllegalArgumentException('超时值为负');}if (millis==0) { while (isAlive()) { wait(0) }} else { while (isAlive()); }延迟=毫秒- 现在; if (延迟=0) { 中断; } 现在=System.currentTimeMillis() - 基础;
wait 在第12 行被调用。注意这里的wait指的是线程1的调用者,而不是执行等待的线程1对象。这相当于在主线程上进行等待。可以理解为下面的伪。代码:
t1.start();while(t1.isAlive()){ Thread.currentThread().doWait()} 此时执行过程是循环执行代码块3的第11行到第13行。 1 执行完毕,生命周期结束,isAlive()返回false,在第11-13行退出循环,继续执行下一段代码,并切换到并行执行状态。要达到上述执行效果,不需要创建t1线程,而是直接在主线程中调用t1的核心逻辑。这是代码:
public static void main(String[] args) throws InterruptedException { //线程t1=new Thread(new DoSth(), '线程1');=new Thread(new DoSth(), 'Thread 3'); //t1.start(); //new DoSth().run(); //直接调用业务逻辑而不是Assign。与之前的代码相比,它传递了应该在子线程t1 中执行的内容。在主线程上运行它可以获得相同的效果。这个特性体现了所谓的连接,现在你明白为什么它被称为连接了。 join在实际应用中是如何使用的呢?我们将上面的代码进行改造并举例说明。
public static void main(String[] args) throws InterruptedException { 线程t1=新线程(new DoSth(), '组1') 线程t2=新线程(new DoSth(), '组2'); DoSth(), '组3'); t3.join(); System.out.println('集合完成');}执行结果:
第3组正在集合。 第2组正在集合。 第1组正在集合。 第1组正在集合。 第1组正在集合。 - 线程被分发以完成各自的任务。当所有子线程完成后主线程进行统一汇总时,join 很有用。然而,细心的读者会注意到这些子线程并不返回结果。如果需要返回结果供主线程使用,则不再可能单独实现Runnable 来实现此目的。现在,您需要使用其他接口:Feature 和Callable。
版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。