в любом случае запустить поток, давая ему аргумент? - PullRequest
1 голос
/ 14 июля 2011

Может кто-нибудь сказать мне, если есть способ запустить поток и дать ему аргумент? это похоже на аргумент метода runnable, например,

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 ]

4 голосов
/ 14 июля 2011

Нет, это невозможно, просто из-за того, что интерфейс 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 ;  
     }
}
3 голосов
/ 14 июля 2011

Вы можете сказать, Да и Нет.

NO: run() Метод, определенный в интерфейсе Runnable, не принимает аргументов.Поскольку вы реализуете интерфейс Runnable, вы будете реализовывать метод run() интерфейса Runnable, который оказывается методом без аргументов.

YES: Однако вы можете создать перегруженныйметод 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 ;  
     }
}
0 голосов
/ 14 июля 2011

Метод Runnable.run() не принимает никаких аргументов, и вы не можете это изменить. Но есть способы передать входные данные и вернуть выходные данные из потока. Например:

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() и использовать аргументы конструктора, методы получения и / или установки для передачи аргументов и результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...