[java] Java에서 별도의 스레드로 메서드를 호출하는 방법은 무엇입니까?

방법이 있다고 가정 해 봅시다 doWork(). 메인 스레드가 아닌 별도의 스레드에서 어떻게 호출합니까?



답변

Runnable인터페이스 를 구현하는 클래스를 만듭니다 . 실행하려는 코드를 run()메소드 에 넣으십시오 Runnable. 이것이 인터페이스 를 준수하기 위해 작성해야하는 메소드입니다 . “기본”스레드에서 새 Thread클래스를 만들고 생성자에의 인스턴스를 전달한 Runnable다음 호출 start()합니다. startJVM에게 새 스레드를 만드는 마법을 수행 한 다음 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);