방법이 있다고 가정 해 봅시다 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
패키지를.
답변
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();
}
});
답변
Java 8에서는 한 줄의 코드로이를 수행 할 수 있습니다.
메서드가 매개 변수를 사용하지 않는 경우 메서드 참조를 사용할 수 있습니다.
new Thread(MyClass::doWork).start();
그렇지 않으면 람다 식으로 메서드를 호출 할 수 있습니다.
new Thread(() -> doWork(someParam)).start();
답변
사물을 호출하는 또 다른 빠른 옵션 (예 : DialogBoxes 및 MessageBoxes 및 스레드가 아닌 메서드를위한 별도의 스레드 생성)은 Lamba 표현식을 사용하는 것입니다.
new Thread(() -> {
"code here"
}).start();
답변
얼마 전에 JDK5 실행기 서비스를 사용하고 백그라운드에서 특정 프로세스를 실행하는 간단한 유틸리티 클래스를 작성했습니다. doWork ()는 일반적으로 void 반환 값을 가지므로이 유틸리티 클래스를 사용하여 백그라운드에서 실행할 수 있습니다.
이 유틸리티를 문서화 한이 기사를 참조하십시오 .
답변
RxJava 2.x로이를 달성하려면 다음을 사용할 수 있습니다.
Completable.fromAction(this::dowork).subscribeOn(Schedulers.io().subscribe();
이 subscribeOn()
메서드는 작업을 실행할 스케줄러를 지정합니다. RxJava에는 Schedulers.io()
I / O 작업을위한 스레드 풀과 Schedulers.computation()
CPU 집약적 인 작업을위한 스레드 풀을 포함하여 미리 정의 된 여러 스케줄러 가 있습니다.
답변
Java 8 이상을 사용하는 경우 CompletableFuturerunAsync
클래스의 메소드 를 사용할 수 있습니다.
CompletableFuture.runAsync(() -> {...});
결과를 반환해야하는 경우 supplyAsync
대신 사용
CompletableFuture.supplyAsync(() -> 1);