누구든지 매개 변수를 스레드에 전달하는 방법을 제안 할 수 있습니까?
또한 익명 클래스에서는 어떻게 작동합니까?
답변
생성자의 매개 변수를 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
class
Runnable
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();