0

好的,现在我基本上有这段代码:

class a {

public void ab() {
    b thread = new b();
     thread.bb(this);
    }
}

class b {

    public void bb(a _a) {
     //execute code here in new thread so ab can continue running
    }
}

但是,这不会在新线程中打开它,是的,我确实对此进行了研究,我发现的所有解决方案都没有留下任何选项将参数(this)发送到 bb 方法

如何在需要参数的新线程中调用 class.method?

4

2 回答 2

2

问题是“如何在需要参数的新线程中调用 class.method?”

答案是“你不能”......但是,这是一种解决方法:使用带有构造函数的实例来定义执行的“上下文”。

class MyThread extends Thread {
   MyThread( A a ){
      this.a = a;
   }
   @Override public void run() {
      ... use this.a; // a was the "parameter"
   }
   private A a;
}

MyThread myThread = new MyThread( aValue );
myThread.start();
于 2012-10-22T21:06:32.630 回答
1

要启动一个线程,你必须有一个 的实例java.lang.Thread,但它b不是。您可以扩展线程来实现这一点。

class b extends Thread {

无论您在其run()方法中放置什么,线程都会异步运行,您可以从其原始(空)实现中覆盖它。

class b extends Thread {

    @Override
    public void run() {
    }
}

但是,这不允许您传递a. 您最好的选择是a在 的构造函数中将 的实例作为实例变量b

class b extends Thread {

    private final a _a;

    public b(a _a) {
        this._a = _a;
    }

    @Override
    public void run() {
        //now you can use _a here
    }
}

最后,要异步运行线程,您不会调用新实现的run()方法,而是调用Thread#start(),它会run()在新线程中调用该方法。

class a {

    public void ab() {
        b thread = new b(this);
        thread.start();
    }
}

作为旁注,标准 Java 约定是以大写字母开头的类名,因此您应该重命名aA等等。然而,就编译或执行而言,这不会产生任何影响。

于 2012-10-22T21:06:51.570 回答