Java에서 별도의 스레드를 사용하여 메서드를 호출하려면 어떻게 해야 합니까?
내가 방법이 있다고 가정해 보자.doWork()
(메인 스레드가 아닌) 다른 스레드에서는 어떻게 부르죠?
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();
}
});
를 구현하는 클래스를 만듭니다.Runnable
인터페이스입니다.실행할 코드를 에 입력합니다.run()
method - 이 메서드는 다음 명령어를 준수하기 위해 작성해야 합니다.Runnable
인터페이스입니다."메인" 스레드에서 새 스레드를 만듭니다.Thread
class, constructor의 instance를 전달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
패키지.
Java 8에서는 이 작업을 코드 한 줄로 수행할 수 있습니다.
메서드에 매개 변수가 없는 경우 메서드 참조를 사용할 수 있습니다.
new Thread(MyClass::doWork).start();
그렇지 않으면 람다 식에서 메서드를 호출할 수 있습니다.
new Thread(() -> doWork(someParam)).start();
적어도 Java 8을 사용하고 있는 경우는, 다음의 방법을 사용할 수 있습니다.runAsync
클래스 Complete 테이블에서미래
CompletableFuture.runAsync(() -> {...});
결과 사용을 반환해야 하는 경우supplyAsync
대신
CompletableFuture.supplyAsync(() -> 1);
다른 빠른 호출 옵션(DialogBoxes나 MessageBoxes 등)은 Lamba Expression을 사용하는 것입니다.
new Thread(() -> {
"code here"
}).start();
RxJava 2.x에서 이를 실현하려면 다음 명령을 사용합니다.
Completable.fromAction(this::dowork).subscribeOn(Schedulers.io().subscribe();
그subscribeOn()
method는 액션을 실행할 스케줄러를 지정합니다.RxJava에는 다음과 같은 몇 가지 사전 정의된 스케줄러가 있습니다.Schedulers.io()
I/O 작업을 위한 스레드 풀이 있습니다.Schedulers.computation()
CPU 부하가 높은 조작을 목적으로 하고 있습니다.
얼마 전 JDK5 executor 서비스를 사용하여 백그라운드에서 특정 프로세스를 실행하는 간단한 유틸리티 클래스를 작성한 적이 있습니다.일반적으로 doWork()는 void 반환값을 가지므로 이 유틸리티 클래스를 사용하여 백그라운드에서 실행할 수 있습니다.
언급URL : https://stackoverflow.com/questions/3489543/how-to-call-a-method-with-a-separate-thread-in-java
'itsource' 카테고리의 다른 글
Vue JS 2에서 부모 요소 태그를 동적으로 변경합니다. (0) | 2022.08.27 |
---|---|
복사-붙여넣기 링크가 제대로 작동하는 동안 링크가 작동하지 않음 (0) | 2022.08.27 |
구성 요소의 html 요소 유형 변경 (0) | 2022.08.27 |
vuejs router-link가 느린 로드 경로에서 작동하지 않음 (0) | 2022.08.27 |
형식 설명서의 다른 vue 모듈에서 vue 모듈 가져오기 (0) | 2022.08.27 |