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

时间:2012-10-22 20:59:45

标签: java multithreading

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

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?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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()方法。 / p>

class a {

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

作为旁注,标准Java约定是使用大写字母启动类名,因此您应该将a重命名为A,依此类推。然而,就编译或执行而言,这不会有任何区别。