Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在需要参数的新线程中调用class.method_Java_Multithreading - Fatal编程技术网

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

Java 在需要参数的新线程中调用class.method,java,multithreading,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 } } 然而,这并没有在一个新线程中打开它,是的,我做了研究,我发现的所有解决方案

好的,现在我有了基本的代码:

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
    }
}
然而,这并没有在一个新线程中打开它,是的,我做了研究,我发现的所有解决方案都没有留下任何选项来向bb方法发送一个参数(这个)

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

问题是“如何在需要参数的新线程中调用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();
问题是“如何在需要参数的新线程中调用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();

要启动线程,您必须有一个
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约定是以大写字母开头类名,因此您应该将
a
重命名为
a
,以此类推。但是,这对编译或执行没有任何影响。

要启动线程,必须有
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约定是以大写字母开头类名,因此您应该将
a
重命名为
a
,以此类推。但是,这对编译或执行没有任何影响。

你研究了什么?、经历了这个你研究了什么?、经历了这个好的,我的第一个问题是,我已经尝试了所有这些,当我执行线程时。start()只是一个错误,说start不存在。第二个问题是,这不会创建一个新的实例吗?我需要已经运行的特定实例,因为它是您需要在
class b
中扩展线程的GUI,以便
start
存在。这不会创建
a
的新实例,因为所包含的
This
是作为参数传递的。谢谢大家的帮助,但是忘了java吧,这是一个语言笑话。好吧,我的第一个问题是,当我执行该线程时,我已经尝试了所有这些。start()只是一个错误,说start不存在。第二个问题是,这不会创建一个新的实例吗?我需要已经运行的特定实例,因为它是您需要在
class b
中扩展线程的GUI,以便
start
存在。这不会创建
a
的新实例,因为所包含的
This
作为参数传递。感谢大家的帮助,但忘了java,这是一个语言笑话。我将行拆分为更显式:构造函数调用我将行拆分为更显式:构造函数调用