방법이 있다고 가정 해 봅시다 doWork()
. 메인 스레드가 아닌 별도의 스레드에서 어떻게 호출합니까?
방법이 있다고 가정 해 봅시다 doWork()
. 메인 스레드가 아닌 별도의 스레드에서 어떻게 호출합니까?
답변:
Runnable
인터페이스 를 구현하는 클래스를 만듭니다 . 실행하려는 코드를 run()
메소드 에 넣으십시오 Runnable
. 이것이 인터페이스 를 준수하기 위해 작성해야하는 메소드입니다 . "기본"스레드에서 새 Thread
클래스를 만들고 생성자에의 인스턴스를 전달한 Runnable
다음 호출 start()
합니다. start
JVM에게 새 스레드를 만드는 마법을 수행 한 다음 run
해당 새 스레드에서 메서드 를 호출하도록 지시합니다 .
public class MyRunnable implements Runnable {
private int var;
public MyRunnable(int var) {
this.var = var;
}
public void run() {
// code in the other thread, can reference "var" variable
}
}
public class MainThreadClass {
public static void main(String args[]) {
MyRunnable myRunnable = new MyRunnable(10);
Thread t = new Thread(myRunnable)
t.start();
}
}
시작하려면 Java의 동시성 자습서 를 살펴보십시오 .
메서드가 자주 호출되는 경우 비용이 많이 드는 작업이므로 매번 새 스레드를 생성 할 가치가 없습니다. 일종의 스레드 풀을 사용하는 것이 가장 좋습니다. 한 번 봐 가지고 Future
, Callable
, Executor
에서 클래스 java.util.concurrent
패키지를.
run()
메서드는 매개 변수를 사용하지 않으므로 변수를 전달할 수 없습니다. 생성자에 전달하는 것이 좋습니다. 내 대답을 수정하여 표시합니다.
new Thread() { public void run() {myMethod();}}.start();
방법을 알아요 , 그게 가장 짧은가요?
Runnable
광산 확장하는 클래스입니다 - Runnable
. 그리고 인스턴스화 된 객체에 상태를 전달하는 자체 생성자가 있습니다.
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// code goes here.
}
});
t1.start();
또는
new Thread(new Runnable() {
@Override
public void run() {
// code goes here.
}
}).start();
또는
new Thread(() -> {
// code goes here.
}).start();
또는
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
myCustomMethod();
}
});
또는
Executors.newCachedThreadPool().execute(new Runnable() {
@Override
public void run() {
myCustomMethod();
}
});
run()
됩니까?
Java 8에서는 한 줄의 코드로이를 수행 할 수 있습니다.
메서드가 매개 변수를 사용하지 않는 경우 메서드 참조를 사용할 수 있습니다.
new Thread(MyClass::doWork).start();
그렇지 않으면 람다 식으로 메서드를 호출 할 수 있습니다.
new Thread(() -> doWork(someParam)).start();
->
의미합니까?
Celery task queue
비동기적인 것들에 사용
얼마 전에 JDK5 실행기 서비스를 사용하고 백그라운드에서 특정 프로세스를 실행하는 간단한 유틸리티 클래스를 작성했습니다. doWork ()는 일반적으로 void 반환 값을 가지므로이 유틸리티 클래스를 사용하여 백그라운드에서 실행할 수 있습니다.
이 유틸리티를 문서화 한이 기사를 참조하십시오 .
Java 8 이상을 사용하는 경우 CompletableFuturerunAsync
클래스의 메소드 를 사용할 수 있습니다.
CompletableFuture.runAsync(() -> {...});
결과를 반환해야하는 경우 supplyAsync
대신 사용
CompletableFuture.supplyAsync(() -> 1);