当前位置:首页 > 时尚 >

join用法及搭配(join的用法和固定搭配)

来源:原点资讯(m.360kss.com)时间:2023-11-03 20:36:32作者:YD166手机阅读>>

java多线程里的join,从字面意思来看是联合,合并的意思,但如果面试时这么回答,基本上可以断定面试者还没搞懂。join究竟能干什么,今天给出一个最通俗的解释,那就是在多线程环境下实现暂时以单线程执行,或者说在并行执行的环境中实现暂时以串行执行。为了说明这个问题,我们看一段再常见不过的代码,代码内容是,让三个线程分布去打印一段内容

//代码块1 public class TestJoin { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(new DoSth()); Thread t2 = new Thread(new DoSth()); Thread t3 = new Thread(new DoSth()); t1.start(); t2.start(); t3.start(); System.out.println("主线程执行"); } } class DoSth implements Runnable { @Override public void run() { int n = 5; while (n > 0) { System.out.println(Thread.currentThread().getName()); try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } n--; } } }

执行结果如下:

线程1执行 线程2执行 线程3执行 线程2执行 线程3执行 线程1执行 线程2执行 线程3执行 线程2执行 线程3执行 线程2执行 线程3执行 线程1执行 线程1执行 线程1执行

可见三个线程各自并行执行,并无明确的先后顺序。但如果我们在t.start()后面加上这行代码,

//代码块2 t1.start(); t1.join();

看会出现看什么样的结果:

线程1执行 线程1执行 线程1执行 线程1执行 线程1执行 线程2执行 线程3执行 线程3执行 线程2执行 线程3执行 线程2执行 线程3执行 线程2执行 线程3执行 线程2执行

可以看到线程1执行结束之后线程2和3才开始执行,可见在线程1执行过程中,其他线程并未执行,线程1结束后,线程2,线程3开始并行执行,这就印证了前面的结论,即:join的作用是在多线程环境下暂时以单线程执行。明白了这一点,接下来的问题是,这个特性是怎么实现的呢?我们跟到源码:可以看到

//代码块3

public final synchronized void join(long millis)

throws InterruptedException {

long base = System.currentTimeMillis();

long now = 0;

if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (millis == 0) { while (isAlive()) { wait(0); } } else { while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } }

}

在第12行调用了wait,注意这里的wait,它并不是指线程线程1对象执行wait,而是线程1的调用者,也就是相当于在主线程去执行wait,可等价理解为以下伪代码:

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 { //Thread t1 = new Thread(new DoSth(), "线程1"); Thread t2 = new Thread(new DoSth(), "线程2"); Thread t3 = new Thread(new DoSth(), "线程3"); //t1.start(); //t1.join(); new DoSth().run();//直接调用业务逻辑,而不是分配线程去执行 t2.start(); t3.start(); System.out.println("主线程执行"); }

和之前的代码相比,本来需要在子线程t1中执行的内容,通过在主线程中执行达到了相同的效果,而这种特性,就体现了所谓的join,现在你明白为什么叫join了吧?join在实际应用当中有什么用呢?把以上代码改造一下,用一个例子来说明。

public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(new DoSth(), "小组1"); Thread t2 = new Thread(new DoSth(), "小组2"); Thread t3 = new Thread(new DoSth(), "小组3"); t1.start(); t2.start(); t3.start(); t1.join(); t2.join(); t3.join(); System.out.println("集合完毕"); }

执行结果:

小组3正在集合 小组1正在集合 小组2正在集合 小组3正在集合 小组1正在集合 小组2正在集合 小组3正在集合 小组1正在集合 集合完毕

当我们需要多个子线程分布去完成各自的任务,并在这些子线程全部完成后,主线程做统一汇总时,join就派上用场了。不过细心的读者会发现,这些子线程并未返回任何结果,如果我们需要返回结果供主线程使用时,该怎么实现,针对这一需求,单靠实现Runnable的方式已经无法做到了,此时需要用到另外的接口:Feature和Callable。

join用法及搭配,join的用法和固定搭配(1)

栏目热文

join后面加什么或什么(英语单词哪些后面加es)

join后面加什么或什么(英语单词哪些后面加es)

前天写SQL时本想通过 A left B join on and 后面的条件来使查出的两条记录变成一条,奈何发现还是有两...

2023-11-03 20:51:27查看全文 >>

join后面加动词的用法(inner join用法on后面多个条件)

join后面加动词的用法(inner join用法on后面多个条件)

在这篇文章中,你将学习到will的不同含义和功能,以及如何正确地使用它来表达你的意思。will是一个非常重要的英语单词,...

2023-11-03 21:09:54查看全文 >>

总结join的用法并举例(join的三种用法总结)

总结join的用法并举例(join的三种用法总结)

join v. “参加,加入 ” 短暂性动词,不能和一段时间连用1、Join 加入某些人、某个组织或团体,成为其中一员,...

2023-11-03 20:55:29查看全文 >>

join的三个用法(join英语怎么发音)

join的三个用法(join英语怎么发音)

作者:CodingStarcnblogs.com/BoyceYang/p/3145279.html一、概要JOIN对于接...

2023-11-03 20:50:22查看全文 >>

join四种用法(join英语怎么发音)

join四种用法(join英语怎么发音)

这几个词或短语都有“参加”的意思,但用法不同。一 ,join有两个用法:(1)指加入某个党派,团体组织等,成为其成员之一...

2023-11-03 20:59:18查看全文 >>

nvidia控制面板打不开也无法启动(重启后打不开nvidia控制面板)

nvidia控制面板打不开也无法启动(重启后打不开nvidia控制面板)

IT之家3月26日消息 根据Videocardz的报道,英伟达发布了GeForce Hotfix 445.78驱动,解决...

2023-11-03 20:40:05查看全文 >>

nvidia控制面板打开无反应(控制面板mail打开无反应)

nvidia控制面板打开无反应(控制面板mail打开无反应)

问:电脑上面怎么打开NVIDIA控制面板?答:在Windows的电脑中打开NVIDIA控制面板的方法有很多,下面介绍几个...

2023-11-03 20:22:45查看全文 >>

nvidia控制面板找不到了怎么办(nvidia控制面板怎么打不开)

nvidia控制面板找不到了怎么办(nvidia控制面板怎么打不开)

重装系统之后电脑右键没有显卡控制面板是怎么回事呢,首先我们先看下驱动是不是正常的,此电脑右击,管理,设备管理器,显示适配...

2023-11-03 20:51:28查看全文 >>

nvidia控制面板停止工作打不开(nvidia 控制面板打不开怎么办)

nvidia控制面板停止工作打不开(nvidia 控制面板打不开怎么办)

英伟达NVIDIA显卡控制面板可以对显卡的各种参数进行调整,但是有用户发现每次打开控制面板的时候都会出现已停止工作的问题...

2023-11-03 20:54:03查看全文 >>

nvidia控制面板自定义打不开(英伟达控制面板分辨率识别错误)

nvidia控制面板自定义打不开(英伟达控制面板分辨率识别错误)

大家好,我是三全。本期我来分享一下我的游戏画面设置,分为英伟达控制面板设置和游戏内画面设置两部分。我的电脑配置是最普通的...

2023-11-03 20:24:50查看全文 >>

文档排行