栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java如何知道其他线程是否已完成?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java如何知道其他线程是否已完成?

你可以通过多种方式执行此操作:

  1. 在主线程中使用
    Thread.join()
    以阻塞方式等待每个线程完成,或者
  2. 以轮询方式(通常不鼓励使用)检查
    Thread.isAlive()
    ,等待每个线程完成,或者
  3. 非常规的,对于每个有问题的线程,调用
    setUncaughtExceptionHandler
    来调用对象中的方法,并对每个线程进行编程以在完成时抛出未捕获的
    Exception
    ,或者
  4. 使用
    java.util.concurrent
    中的锁或同步器或机制,或者
  5. 更传统的做法是,在主线程中创建一个侦听器,然后对每个线程进行编程以告知侦听器它们已完成。
    如何实施想法5?好吧,一种方法是首先创建一个接口:
public interface ThreadCompleteListener {    void notifyOfThreadComplete(final Thread thread);}

然后创建以下类:

public abstract class NotifyingThread extends Thread {  private final Set<ThreadCompleteListener> listeners        = new CopyOnWriteArraySet<ThreadCompleteListener>();  public final void addListener(final ThreadCompleteListener listener) {    listeners.add(listener);  }  public final void removeListener(final ThreadCompleteListener listener) {    listeners.remove(listener);  }  private final void notifyListeners() {    for (ThreadCompleteListener listener : listeners) {      listener.notifyOfThreadComplete(this);    }  }  @Override  public final void run() {    try {      doRun();    } finally {      notifyListeners();    }  }  public abstract void doRun();}

然后你的每个线程都将扩展

NotifyingThread
,而不是实现
run()
它将实现
doRun()
。因此,完成后,他们将自动通知任何等待通知的人。

最后,在你的主类(启动所有线程(或至少等待通知的对象)的主类)中,将该类修改为

implement ThreadCompleteListener
创建每个线程后立即将其自身添加到侦听器列表中:

NotifyingThread thread1 = new oneOfYourThreads();thread1.addListener(this); // add ourselves as a listenerthread1.start();// Start the Thread

然后,在每个线程退出时,

notifyOfThreadComplete
将使用刚刚完成(或崩溃)的Thread实例调用你的方法。

需要注意的是更好的将

implements Runnable
,而不是
extends Thread
用于
NotifyingThread
为延长线为新的代码通常气馁。但是,我正在编码你的问题。如果你更改NotifyingThread要实现的类,
Runnable
则必须更改一些管理线程的代码,这非常简单。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/404798.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号