Java中Thread.join方法使用技巧

Thread.join() 非常重要。
这仅取决于线程的执行方式。
想象一下,一个线程运行完毕后,你的主线程还在运行,你必须等待它。
期待什么 Just Thread.join() 例如,2 02 2 年,我在北京创建了一个演示,创建了一个名为 T 的线程。
t 函数,运行一个循环,打印一些东西。
爪哇 线程 t = 新线程 (() -> { for (int i = 0; i < 5> System.out.println("子线程结束,主线程继续");
你看,没有join()的东西,主线程直接在上面运行,子线程还没有结束。
当添加 join() 时,主线程会巧妙地等待。

但有时它不起作用。
例如,如果 t 处于无限循环中,则 join() 将不会返回并卡在那里。
该怎么办?
您必须设置超时。
例如,我最多等待 3 秒。
仅对条目使用串联(长毫秒)。
爪哇 t.加入(3 000); // 最多等待 3 秒 如果 (t.isAlive()) { System.out.println("子线程未超时,超时逻辑"); }
超时后,继续做其他事情。
否则就会卡在那里,这样就不行了。

而且,他们现在都使用线程池了,不是吗?就像ExecutorService一样。
对于线程池中的线程,不能直接使用join()。

该怎么办?您应该使用 Future.get()。
爪哇 ExecutorService 执行器 = Executors.newSingleThreadExecutor(); 转发 <?> 转发 = executor.submit(() -> { /功能逻辑/ }); future.get(); // 这相当于 join()

Future.get() 等待函数完成运行。
结果几乎是一样的。

但是,该对象会抛出 InterruptedException。
你必须处理它。
爪哇 尝试{ t.join(); } catch (InterruptedException e) { Thread.currentThread() 中断(); // 重置中断标志 // 根据需要进行处理,例如重试或其他 }
恢复暂停状态,做其他事情。

也不搞限制。
如果你的主线程在等待t,而t又在等待另一个线程,那不是会卡住吗?
也不要总是使用 join()。
如果使用过多,会议效果就会降低。
这取决于具体情况。

简而言之,如果 Thread.join() 使用正确,线程的顺序可以管理跟进。
但你应该能够使用它,特别是超时和线程池。

如何实现多线程

哈,说到多线程,这是Java编程中一个非常有趣的话题。
我过去在论坛上遇到过很多关于这个问题的讨论。

先说第一个问题,继承Thread类实现多线程。
这个方法非常简单易懂。
正如你所说,在Demo类中继承Thread类,然后重写run方法。
记得有一次,一个新手在论坛上问,为什么我写的线程不同时运行?后来回头一看,原来是run方法中的代码执行时间太长,导致看起来是顺序执行的。
当时我建议他将耗时操作拆分在run方法中或者使用Thread.sleep()来模拟耗时操作,这样他可以更清楚地看到线程的并发效果。

二、实现Runnable接口,实现多线程。
这种方法更加灵活,因为Runnable接口没有Thread类那么多的方法。
记得有一次,一位开发人员表示,他更喜欢使用 Runnable 接口,因为它可以避免单继承的限制。
在main方法中,他创建了一个Demo类的对象,然后将该对象作为参数传递给Thread类的构造函数,从而创建了两个线程。
这种方式的优点是同一个Runnable对象可以被多个线程共享,在某些情况下可以节省资源。

说实话,这两种方法各有优点。
继承Thread类简单直接,但灵活性稍差;实现 Runnable 接口更加灵活,但代码可能会稍微复杂一些。
我个人更喜欢后者,因为它更符合面向对象的设计原则。

有趣的是,这两种方法在实际应用中都很流行。
例如,当处理大量数据时,我们可能会选择实现Runnable接口,因为它可以减少内存消耗。
在一些简单的情况下,扩展Thread类可能会更方便。

说白了,多线程编程是一门非常高深的学问。
在实际应用中,我们需要根据具体需求选择合适的方法。
我自己没有运行过这个。
我错过了有关 X 的数据,但我建议您查看一下。
希望我的回答可以帮助到您。