[java] Java 스레드에 매개 변수를 전달하려면 어떻게해야합니까?

누구든지 매개 변수를 스레드에 전달하는 방법을 제안 할 수 있습니까?

또한 익명 클래스에서는 어떻게 작동합니까?



답변

생성자의 매개 변수를 Runnable 객체로 전달해야합니다.

public class MyRunnable implements Runnable {

   public MyRunnable(Object parameter) {
       // store parameter for later user
   }

   public void run() {
   }
}

다음과 같이 호출하십시오.

Runnable r = new MyRunnable(param_value);
new Thread(r).start();


답변

익명 클래스의 경우 :

질문 편집에 대한 응답으로 익명 클래스에서 작동하는 방식은 다음과 같습니다.

   final X parameter = ...; // the final is important
   Thread t = new Thread(new Runnable() {
       p = parameter;
       public void run() {
         ...
       };
   t.start();

명명 된 클래스 :

Thread를 확장하거나 Runnable을 구현하는 클래스와 전달하려는 매개 변수가있는 생성자가 있습니다. 그런 다음 새 스레드를 만들 때 인수를 전달한 다음 다음과 같이 스레드를 시작해야합니다.

Thread t = new MyThread(args...);
t.start();

Runnable은 Thread BTW보다 훨씬 나은 솔루션입니다. 그래서 선호합니다 :

   public class MyRunnable implements Runnable {
      private X parameter;
      public MyRunnable(X parameter) {
         this.parameter = parameter;
      }

      public void run() {
      }
   }
   Thread t = new Thread(new MyRunnable(parameter));
   t.start();

이 답변은 기본적 으로이 비슷한 질문과 동일합니다 : Thread 객체에 매개 변수를 전달하는 방법


답변

Runnable 또는 Thread 클래스의 생성자를 통해

class MyThread extends Thread {

    private String to;

    public MyThread(String to) {
        this.to = to;
    }

    @Override
    public void run() {
        System.out.println("hello " + to);
    }
}

public static void main(String[] args) {
    new MyThread("world!").start();
}


답변

이 답변은 매우 늦었지만 누군가 유용 할 것입니다. Runnable명명 된 클래스를 선언하지 않고 매개 변수를 전달하는 방법에 관한 것입니다 (라이너에게 편리함).

String someValue = "Just a demo, really...";
new Thread(new Runnable() {
    private String myParam;
    public Runnable init(String myParam) {
        this.myParam = myParam;
        return this;
    }
    @Override
    public void run() {
        System.out.println("This is called from another thread.");
        System.out.println(this.myParam);
    }
}.init(someValue)).start();

물론 start보다 편리하거나 적절한 순간에 실행을 연기 할 수 있습니다 . 그리고 init메소드 의 서명이 무엇인지 (따라서 더 많은 인수 및 / 또는 다른 인수가 필요할 수 있음) 물론 이름조차도 당신에게 달려 있지만 기본적으로 아이디어를 얻습니다.

실제로 이니셜 라이저 블록을 사용하여 익명 클래스에 매개 변수를 전달하는 다른 방법도 있습니다. 이걸 고려하세요:

String someValue = "Another demo, no serious thing...";
int anotherValue = 42;

new Thread(new Runnable() {
    private String myParam;
    private int myOtherParam;
    {
        this.myParam = someValue;
        this.myOtherParam = anotherValue;
    }
    @Override
    public void run() {
        System.out.println("This comes from another thread.");
        System.out.println(this.myParam + ", " + this.myOtherParam);
    }
}).start();

모든 것은 초기화 블록 내부에서 발생합니다.


답변

스레드를 만들 때의 인스턴스가 필요합니다 Runnable. 매개 변수를 전달하는 가장 쉬운 방법은 생성자에 인수로 전달하는 것입니다.

public class MyRunnable implements Runnable {

    private volatile String myParam;

    public MyRunnable(String myParam){
        this.myParam = myParam;
        ...
    }

    public void run(){
        // do something with myParam here
        ...
    }

}

MyRunnable myRunnable = new myRunnable("Hello World");
new Thread(myRunnable).start();

스레드가 실행되는 동안 매개 변수를 변경하려면 실행 가능한 클래스에 setter 메서드를 추가하면됩니다.

public void setMyParam(String value){
    this.myParam = value;
}

이 작업을 마치면 다음과 같이 호출하여 매개 변수 값을 변경할 수 있습니다.

myRunnable.setMyParam("Goodbye World");

물론 매개 변수가 변경 될 때 작업을 트리거하려면 잠금을 사용해야하므로 상황이 훨씬 복잡해집니다.


답변

스레드를 만들려면 일반적으로 자신 만의 Runnable 구현을 만듭니다. 이 클래스의 생성자에서 스레드에 매개 변수를 전달하십시오.

class MyThread implements Runnable{
   private int a;
   private String b;
   private double c;

   public MyThread(int a, String b, double c){
      this.a = a;
      this.b = b;
      this.c = c;
   }

   public void run(){
      doSomething(a, b, c);
   }
}


답변

당신이 중 하나를 확장 할 수 있습니다 또는를 원하는대로 매개 변수를 제공합니다. 문서 에는 간단한 예제가 있습니다 . 여기에 포트하겠습니다 :Thread classRunnable class

 class PrimeThread extends Thread {
     long minPrime;
     PrimeThread(long minPrime) {
         this.minPrime = minPrime;
     }

     public void run() {
         // compute primes larger than minPrime
          . . .
     }
 }

 PrimeThread p = new PrimeThread(143);
 p.start();

 class PrimeRun implements Runnable {
     long minPrime;
     PrimeRun(long minPrime) {
         this.minPrime = minPrime;
     }

     public void run() {
         // compute primes larger than minPrime
          . . .
     }
 }


 PrimeRun p = new PrimeRun(143);
 new Thread(p).start();