【问题标题】:Callback from new thread to class from which thread was initiated从新线程回调到启动线程的类
【发布时间】:2013-03-25 09:19:59
【问题描述】:

我有一个从中调用新线程的类。

public class MainClass{

 private void cleardata() {
                // do something on a separate thread
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //Do Something
        //After this I would like to notify my MainClass that some thing has been done and pass a value. 
        }
      }
     }
   private void callbackFunc(int a){

    // Do something based on value of a 
  }
}

我的 MainClass 中有一个函数。但是我如何从我的新线程中调用这个函数,以便接收回调。 谢谢。

【问题讨论】:

  • 如果该方法与您的线程在同一个类中,您可以调用它并传递您的结果。
  • 您是否尝试过从 run() 中调用操作
  • 不要混淆ThreadRunnable
  • 有什么区别?

标签: java multithreading callback


【解决方案1】:

您应该能够通过其名称调用MainClass 中的方法,就像您直接从MainClass 本身内部调用一样(而不是从内部类调用)。

如果您要调用的方法名称碰巧与您的内部类从Object 继承的方法名称冲突,那么您可以在调用前加上MainClass.this,例如MainClass.this.toString()MainClass 上调用 toString,而只是 toString() 在内部类实例上调用它。

【讨论】:

  • 非常感谢,一个简单的问题。如果线程来自同一个类,那么即使是私有函数也可以访问?
  • @Sunny 是的,允许内部类或静态嵌套类访问其包含类的所有成员,甚至是私有成员。 private 修饰符限制对类主体的 lexical 范围的访问,其中包括嵌套在其中的任何其他类。
【解决方案2】:

在这种情况下,将 MainClass 的实例传递给线程类((在创建期间)),以便它可以在其上调用方法。拥有其他人建议的内部类也是一个不错的选择。

类似的东西-

class MainClass {

private void cleardata() {
    new Thread(new MyThread(this)).start();
}

}

类 MyThread 实现 Runnable {

private MainClass mc;

MyThread(MainClass mc) {
    this.mc = mc;
}

public void run() {
    // do something
    // mc.someMethod();
}

}

【讨论】:

    【解决方案3】:
    public class MainClass{
    
    private void cleardata() {
            // do something on a separate thread
            new Thread(new Runnable() {
                @Override
                public void run() {
                    callBackFunc(result); 
                }
            }
    }
    
    private void callBackFunc(int a) {
    
    }
    }
    

    【讨论】:

      【解决方案4】:

      去做吧:

      public class MainClass{
      
        private void cleardata() {
                  // do something on a separate thread
                  new Thread(new Runnable() {
                      @Override
                      public void run() {
                          //Do Something
                          notifyTheClass("a parameter");
           }
        }
      
        private void notifyTheClass(String aParam) {
        //..do something else
        }  
       }
      }
      

      但它与线程无关,这是关于内部类的。如果您希望主线程等到新线程完成,请使用Futures 获取结果。或者使用其他一些多线程原语。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-22
        • 2012-03-25
        • 1970-01-01
        • 1970-01-01
        • 2014-06-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多