【问题标题】:child thread to parent thread communication子线程到父线程通信
【发布时间】:2013-08-16 18:01:52
【问题描述】:

我正在 Android 上开发一个 java 多线程应用程序。

线程 1:监听线程。 继续侦听套接字,触发第二个线程以执行某些操作

线程 2:动作线程。 短暂的。从第一个线程被解雇,做一个简单的动作然后死掉。

线程 1 不等待线程 2,因为它在触发线程 2 后返回侦听。

我可以在 Thread2 结束之前在 Thread1 中执行一个方法吗(比如 thread2ActionCompleted())。

由于某种原因,我不能在线程 1 中使用静态方法或静态变量

我看到一些使用ExecutorService 的类似线程,但找不到适合我的情况的好例子。

【问题讨论】:

  • 请使用您所询问的语言编辑您的问题和相关标签。
  • 只需将 Thread1 的引用传递给 Thread2。
  • 不,你使用的是Android。仅供参考,您应该编辑标签而不是评论。始终希望 OP 用更多信息更新问题,而不是将其洒在 cmets 中。
  • 曾经我已经回答过类似的问题,请检查:stackoverflow.com/a/13934591/1891118,有Executor的示例

标签: java android multithreading


【解决方案1】:

看起来你的问题很简单,这是伪代码。

Thread1 {

 run() {
    //check condition
    //If condition meets create Thread Thread2
    //set parent in Thread2
    //start Thread2
 }

  Method m1 {

  }
}

线程1继续运行,你可以根据你的情况启动线程2。

Thread2 {
   Thread1 parent;
   //When done call parent.m1
}

干杯!!

【讨论】:

  • 我想知道thread2在thread1中什么时候完成,并在thread1中调用一些后处理方法。
  • 如何从 thread1 传递 flagDone。我不希望 thread1 继续检查 thread2 是否完成。 thread2 完成后应在 thread1 中调用后处理方法。
  • @ajitk - 这可以通过多种方式完成,但再次编辑伪代码,尽量保持简单。
  • Sachin - 我无法创建 Thread1 的第二个实例。 Thread1 在已建立的通信通道(到 C++ 模块的套接字流)上持续侦听事件。共享此频道会引发更多同步问题。
【解决方案2】:

只是一个更新: 我最终将父线程实例作为参数传递给子线程的构造函数。像魅力一样工作,任何我想一次只访问一次的代码,我都放入了同步块。

Parent Thread: Thread1
Child Thread: Thread2

class Thread1 extends Thread implements Runnable {
  ...
  Thread2 t2 = new Thread2(this);
  new Thread(t2, "ChildThread").start();
  ...
}

class Thread2 extends Thread implements Runnable {
 ...
 Thread1 t1;
 Thread2 (Thread1 t) {
   t1 = t;
 }
 ...
 t1.CallAnyMethod();
 ...
}

【讨论】:

    【解决方案3】:

    您可能想要的是Future。基本上,thread2 会将其结果放置在与thread1 共享的线程安全持有者对象中。当thread1 想知道thread2 发生了什么时,它可以检查Future 对象。

    这可以通过使用ExecutorService 来管理thread2 的生命周期和submitting a CallableExecutorService 来实现。

    【讨论】:

    • 听起来不错。我将探索这个选项,如果它对我有用,我会告诉你。
    【解决方案4】:

    这是实现observer pattern 的潜在候选对象。线程 2 将能够在完成工作时通知其所有观察者(特别是线程 1)。

    例如:

    线程 1 实现了观察者。

    线程 2 实现了 Observable。

    当线程 2 完成时,它会通知所有观察者它已经完成。这将告诉线程 1 线程 2 已完成。

    【讨论】:

    • 我建议您查看 Wikipedia 提供的示例。这是该模式的相对直接的实现。
    • Observable 不是接口。因此,这在我的情况下不起作用。 (这是我得到的错误:Observable 类型不能是 Thread1.java 的超接口;超接口必须是接口)。这基本上意味着线程不能是可观察的。不过它也可以是观察者。
    猜你喜欢
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多