일부 코드를 상속 받았으며 원래 개발자가 남긴 사람이 없습니다. 이 코드는 주로 CompletableFuture
을 사용하며 처음 사용하기 때문에 계속 머리를 감싸려고 노력하고 있습니다. 내가 이해할 때, (Completable)Future
은 일반적으로 시간이 많이 걸리는 작업이 실행되는 동안 우리가 다른 일을 할 수있게 해주는 몇 가지 멀티 스레딩 메커니즘과 함께 사용되며, 그 다음 단순히 미래를 통해 그 결과를 가져온다.멀티 스레딩없이 Future를 사용하는 이유는 무엇입니까?
interface ArchiveSearcher { String search(String target); }
class App {
ExecutorService executor = ...
ArchiveSearcher searcher = ...
void showSearch(final String target) throws InterruptedException {
Future<String> future = executor.submit(new Callable<String>() {
public String call() {
return searcher.search(target);
}});
displayOtherThings(); // do other things while searching
try {
displayText(future.get()); // use future
} catch (ExecutionException ex) { cleanup(); return; }
}
}
그러나, 나는 상속 한이 응용 프로그램에서, 어떤 멀티 스레딩을 사용하지 않는 다음과 같은 패턴이 배의 무리 나타납니다 : the javadoc에서와 같이 나에게
public Object serve(Object input) throws ExecutionException, InterruptedException {
CompletableFuture<Object> result = delegate1(input);
return result.get();
}
private CompletableFuture<Object> delegate1(Object input) {
// Do things
return delegate2(input);
}
private CompletableFuture<Object> delegate2(Object input) {
return CompletableFuture.completedFuture(new Object());
}
을,이다 상당 : 물론
public Object serve(Object input) {
Object result = delegate1(input);
return result;
}
private Object delegate1(Object input) {
// Do things
return delegate2(input);
}
private Object delegate2(Object input) {
return new Object();
}
코드가 훨씬 더 복잡하고, 오류가 발생하는 경우에 exceptionallyCompletedFuture
을 반환하지만 Callable
이다가, 아니 Runnable
, 아니 Executor
, 아니 supplyAsync()
멀티 스레딩의 흔적. 내가 뭘 놓치고 있니? 단일 스레드 컨텍스트에서 Future
을 사용하는 이유는 무엇입니까?
UI 관련 작업이 있습니까? 주 스레드가 사물을 계산하는 경우 속도가 느려집니다. –
@ChristianKuetbach 아니, 없습니다. 하지만 만약 있다면? "메인 스레드"는 무엇을 의미합니까? 내 요점은, 내 이해에, 위의 접근 방식으로 모든 것이 "주요 스레드"입니다. – mark951131b
나는 안드로이드 개발자가 아니지만 "메인 스레드"가 내가 보통 메인 스레드라고 생각하는 것과 다른 것을 의미하는 것 같은 안드로이드 질문을 많이 보아왔다. Swing의 Event Dispatch Thread와 같은 것입니다. –