스레드에 매개 변수를 전달하는 방법을 제안해 주실 수 있나요?
또한 익명 클래스에서는 어떻게 작동하나요?
전달해야 하는 매개변수입니다 구성자를 실행 가능한 개체 수 있습니다.
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();
You have a 클래스를 스레드할 연장시킵니다 (또는 실행 가능한 구축) 와 함께 구성자를 you& 매개변수입니다 # 39; d like to pass 하였으매 만들 때, 새로운 스레드할 통과 후 스레드할 시작합니다. 인수만 합니다, 이 같은 일이.
Thread t = new MyThread(args...);
t.start();
브트와 스레드할 것보다 훨씬 더 잘 실행 가능한 솔루션을 있다. 그래서 I& 포지셔닝하십시오: # 39; d
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();
기본적으로 이 질문에 이 같은 비슷한 질문: 전달하는 방법을 매개변수입니다 스레드로 객체에는
실행 가능 또는 스레드 클래스의 생성자를 통해
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();
}
하지만 어쩌면 누군가 발견하리니 정보기술 (it) 이 매우 늦은 답변 그때그들은 유용합니다. 이는 전달 방법에 대한 선언 '을' 새도 없이 실행 가능한 매개변수입니다 (s) 라는 클래스 (handy 의 린리너스):
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();
물론 '시작' 을 실행 또는 적절한 순간에 좀 더 편리한 연기할 수 있습니다. '초기화' 의 서명입니다 될 때, 이는 최대 뭘 방법 (더 걸릴 수 있도록 및 / 또는 다른 인수만) 물론 있지만, 기본적으로 이름을 알 수 있다.
사실 또한 익명 클래스를 사용할 수 있는 다른 방법을 반군지역 충족되었으며 매개변수입니다 초기화 변해버렸다. 이러한 측면에서 볼 때:
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();
따라서 모든 일이 발생합니까 내부에 초기화 블록.
실행 가능한 인스턴스입니다 스레드할 만들 때 필요한 ','. 가장 쉬운 방법은 통과해야 인수가 구성자를 표시됨과 에서 약간만이라도 매개변수입니다 전달해야 합니다.
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();
그런 다음 변경하십시오 스레드할 실행되는 동안 정렬할지 매개변수입니다 됩니다 세터 메서드로부터 추가하기에서는 데이터베이스에구성원을 실행 가능한 클래스:
public void setMyParam(String value){
this.myParam = value;
}
이 후에는 호출하여 다음과 같은 매개 변수의 값을 변경할 수 있습니다
myRunnable.setMyParam("Goodbye World");
물론 스케쳐내 작업을 트리거할 수 있도록 하는 것을 사용할 때 파라메트가 변경일 합니다 잠급니다 상당히 더 복잡하다.
일반적으로 실행 가능한 구현 스레드할 만들기 위해 직접 만들 수 있습니다. 이 클래스의 구성자를 스레드할 매개 변수를 전달하십시오 있는.
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);
}
}
확장할 수 있습니다 '클래스' ['스레드할'] [1] 또는 '실행 가능한' '클래스' 제공하십시오 매개변수입니다 원하는 대로. [3] 의 [docs] 간단한 예제를 있습니다. # 39, ll 포트로부터 i& 여기에:
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();
[1]: http://java.sun.com/javase/6/docs/api/java/lang/Thread.html = true 는 외부?
[3]: http://java.sun.com/javase/6/docs/api/java/lang/Thread.html = true 는 외부?
Java 로 사용할 수 있습니다 람다 8 캡처하려면 매개변수들로 [효과적으로 최종] (https://stackoverflow.com/a/20938132/960115). 예를 들면 다음과 같습니다.
final String param1 = "First param";
final int param2 = 2;
new Thread(() -> {
// Do whatever you want here: param1 and param2 are in-scope!
System.out.println(param1);
System.out.println(param2);
}).start();
시작 () () 메서드를 통해 반군지역 매개변수입니다 실행하십시오.
// Tester
public static void main(String... args) throws Exception {
ThreadType2 t = new ThreadType2(new RunnableType2(){
public void run(Object object) {
System.out.println("Parameter="+object);
}});
t.start("the parameter");
}
// New class 1 of 2
public class ThreadType2 {
final private Thread thread;
private Object objectIn = null;
ThreadType2(final RunnableType2 runnableType2) {
thread = new Thread(new Runnable() {
public void run() {
runnableType2.run(objectIn);
}});
}
public void start(final Object object) {
this.objectIn = object;
thread.start();
}
// If you want to do things like setDaemon(true);
public Thread getThread() {
return thread;
}
}
// New class 2 of 2
public interface RunnableType2 {
public void run(Object object);
}
자바 가상 머신 (jvm) 에 사용할 수 있습니다 '8' 표현식에서는 람다 (λ) 에 동시성 apiu &. 이 '에스쿠투세비치' 으로 교체 작업에 대한 높은 수준의 스래드입니다 직접:
>. ' ()' 는 새로운 스래드입니다 만드는 뉴카체드트레더풀 스레드 풀 >. 이전에 재사용합니다 스래드입니다 할 뿐, 필요에 따라 건설될 때 >. 사용할 수 있습니다. 이러한 풀에도 는 일반적으로 성능을 향상시킬 수 있는 다양한 프로그램 실행 (be 비동기적입니다 묒뾽.
private static final ExecutorService executor = Executors.newCachedThreadPool();
executor.submit(() -> {
myFunction(myParam1, myParam2);
});
집행 '참조' javadoc.
내가 알고 있는 몇 년이나 늦게 온 I& # 39 m, 하지만 난 뒤, 이 문제에 대해 한 unorthodox 외곽진입. 이것이 내가 하지 않고, 그래서 내가 원하는 일을 하는 새로운 클래스를 지었지.
int x = 0;
new Thread((new Runnable() {
int x;
public void run() {
// stuff with x and whatever else you want
}
public Runnable pass(int x) {
this.x = x;
return this;
}
}).pass(x)).start();
public class WorkingTask implements Runnable
{
private final Object toWorkWith;
public WorkingTask(Object workOnMe)
{
toWorkWith = workOnMe;
}
public void run()
{
//do work
}
}
//...
Thread t = new Thread(new WorkingTask(theData));
t.start();
그렇게 되면 - 빈틈없어야 전달했는지, & # 39 의 객체의 데이터 무결성에 신중한 꽂으십시오 WorkingTask& # 39;. 그러니 이제 존재하는 데이터를 서로 다른 두 스래드입니다 금고에도요 스레드할 합니다
나는 내 자신의 목적을 위해 일반적으로 실행 가능한 '일반' 콜백하는 구현하십시오 관련 정보를 매개변수입니다 (s):
public interface Runnable<TResult> {
void run(TResult result);
}
사용 방법은 간단합니다.
myManager.doCallbackOperation(new Runnable<MyResult>() {
@Override
public void run(MyResult result) {
// do something with the result
}
});
Manager:
public void doCallbackOperation(Runnable<MyResult> runnable) {
new AsyncTask<Void, Void, MyResult>() {
@Override
protected MyResult doInBackground(Void... params) {
// do background operation
return new MyResult(); // return resulting object
}
@Override
protected void onPostExecute(MyResult result) {
// execute runnable passing the result when operation has finished
runnable.run(result);
}
}.execute();
}
한 추가 옵션으로. 이 같은 항목을 비동기 함수 호출 실행 가능한 이 외곽진입 사용할 수 있습니다. 그 결과 일부 임무를 수행하는 경우, 예를 들어 있지 않아도 그냥 복귀하십시오 액션을 don& # 39, t 걱정할 필요가 있는 방법을 뒤로를 전달하십시오 outcome" ";).
이 패턴은 항목을 필요한 곳에 함정이거나 내부 상태를 다시 사용할 수 있습니다. (S) 의 중재를 위해 신경을 쓰지 않을 때 반군지역 매개변수입니다 구성자를 요구되는가 프로그램 액세스하도록 매개변수입니다. 많은 경우 다른 모든 등 활용 部门从 검사를 할 수 있습니다.
public class MyRunnable implements Runnable
{
private final Boolean PARAMETER_LOCK = false;
private X parameter;
public MyRunnable(X parameter) {
this.parameter = parameter;
}
public void setParameter( final X newParameter ){
boolean done = false;
synchronize( PARAMETER_LOCK )
{
if( null == parameter )
{
parameter = newParameter;
done = true;
}
}
if( ! done )
{
throw new RuntimeException("MyRunnable - Parameter not cleared." );
}
}
public void clearParameter(){
synchronize( PARAMETER_LOCK )
{
parameter = null;
}
}
public void run() {
X localParameter;
synchronize( PARAMETER_LOCK )
{
localParameter = parameter;
}
if( null != localParameter )
{
clearParameter(); //-- could clear now, or later, or not at all ...
doSomeStuff( localParameter );
}
}
}
스레드할 t = 새 스레드 (새 미루나블 (매개변수)); 트리스타르트 ();
또한 필요한 경우, 그 처리 완료 할 때 좌표계나 미루나블 서브 작업 완료. & # 39 의 가공할지 진정하라구요 스레드할 뒤로를 전화를 전달할 수 있습니다,, # 39 t& 상술합니다.
지역 변수를 만들 수 있는 '또는' 는 '클래스에 스레드할 연장시킵니다 실행 가능한'.
public class Extractor extends Thread {
public String webpage = "";
public Extractor(String w){
webpage = w;
}
public void setWebpage(String l){
webpage = l;
}
@Override
public void run() {// l is link
System.out.println(webpage);
}
public String toString(){
return "Page: "+webpage;
}}
이런 방식으로 실행할 때 이 변수를 전달할 수 있습니다.
Extractor e = new Extractor("www.google.com");
e.start();
출력:
"www.google.com"