无论如何,在给它一个参数的同时运行一个线程?

时间:2011-07-14 09:20:48

标签: java multithreading runnable concurrency

有人能告诉我是否有办法运行一个线程并给它一个参数?就像给Runnable的run方法一个参数,就像

一样
class Test implements Runnable 
{
     public void run( char a ) { // the question's here ,
                                 //is there any way to run a thread , 
                                 //indicating an argument for it ? 
        do  something with char a ;  
     }
}

3 个答案:

答案 0 :(得分:4)

不,这是不可能的,仅仅是因为Runnable接口没有run方法的参数。您可以将值赋给Thread的成员变量并使用它:

class Test implements Runnable 
{
     private final char a;

     public Test(char a) {
         this.a  = a;
     }

     public void run() {
       // do  something with char a ;  
     }
}

答案 1 :(得分:3)

你可以说,是和否。

Runnable接口中定义的

NO: run()方法不带参数。由于您实现了Runnable接口,因此您将实现Runnable接口的run()方法,这恰好是一种无法方法。

是:但是,您可以创建run()的重载方法,该方法可以接受参数。编译器不会抱怨它。但是 记住一件事, 在线程启动时永远不会调用它。它总是会调用no-arg run()方法。

例如

class Test implements Runnable 
{
     public void run() {
      // ... thread's task, when it is started using .start()
      }

     // Overloaded method  : Needs to be called explicitly.
     public void run(char a) { 
      //do  something with char a ;  
     }
}

答案 2 :(得分:0)

Runnable.run()方法不接受任何参数,您无法更改它。但是有一些方法可以将输入传递给Thread并从Thread返回输出。例如:

public int someMethod(final int arg) throws InterruptedException {
    final int[] result = new int[1];
    Thread t = new Thread(new Runnable() {
        public void run() {
            result[0] = arg * arg;
        }
    });
    t.start();
    // do something else
    t.join();
    return result[0];
}

请注意,run()方法只能引用封闭方法的final变量,但这些变量可以引用可变对象;例如int[]

这种变化是使用封闭类的实例变量。

或者,您可以创建Thread的子类,实现其run()方法,并使用构造函数参数,getter和/或setter来传递参数和结果。