2014-04-27 7 views
-1

내가하는 방법이 아닌 차단을하고, 그대로 앱을 계속하고 여전히 확실 반환 값 싶어한다고 가정비 차단 Java 메소드

Key key = datastore.put(complexInstance); 
String name = key.getName(); 
doSomethingWithTheName(name); 

하거나, 일부 Java 환경을 그 스레드를 30 초 이상 실행할 수 없습니다.

어디 풋 방법 :

public Key put(Object instance){ 
    Key result = null; 
    // In here process could take up time, say 30 seconds or more, IDK :-/ 
    return result; 
} 

이를 달성하기위한 전략은 무엇입니까?

+0

답변을 제출 한 후 질문을 편집하고 "sendTheKeyToTheUI (key)"메서드를 완전히 제거하여 관련성이없는 것으로 보았습니다. 방법 편집 질문이 있으며 이것은 잘못된 접근법입니다. – Lokesh

+1

최근 편집에서 말하는 방식대로 마술을 부탁합니다. 'put'은 30 초가 걸릴 것으로 예상되지만'doSomethingWithTheName'은 30 초 계산에 의존하지만 즉시 실행될 예정입니다. 이것은 수정 구슬이 필요합니다 :-) – Harald

답변

1

ExecutorService의 구현을 Future 객체 (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html)와 함께 사용할 수 있습니다. 새 스레드를 시작하거나 기존 스레드를 사용하면 나중에 결과를 가져올 수 있습니다. 당신은 여전히 ​​스케줄러와 익명의 실행 가능한을 사용할 수 있습니다, 그렇지 않으면

//field in a manager class 
ScheduledExecutorService es = Executors.newScheduledThreadPool(10); 

//Schedule a task 
es.schedule(() -> { /* contents of a runnable */ }, 0, TimeUnit.SECONDS); 

:

0

클래스가 메서드 ExecutorService을 통해 스레드 풀을 가져 와서 메서드를 실행할 필요가 있습니다. 이 변수를 private static 변수로 만들 수는 있지만 전달하거나 클라이언트 코드로 구성하는 것이 더 낫습니다. 크기를 설정할 사람이 더 많습니다.

IO가 비동기 부분 인 경우 더 좋을 수 있습니다 많은 스레드를 사용하는 것보다 Java의 nio 프레임 워크에 구축 된 것을 사용하는 것이 좋습니다.

Future을 반환해야합니다. Java 7을 통해 (적어도 8 가지는 확실하지 않습니다.) Java의 미래 라이브러리는 매우 약하고 명백하게 필요한 기능을 생략했습니다. Functional Java 또는 Google 라이브러리를 확인하십시오. 그러나 많은 라이브러리 (Apache의 MINA, Amazon Web Service의 Java SDK 등)가 이러한 약점을 극복하기 위해 자신의 약속 라이브러리를 구현한다는 것을 알게 될 것입니다. (내 회사 코드베이스에서도 마찬가지였습니다.)

0

자바 (8) 많은 간단한 과정을 만들어

es.schedule(new Runnable() { 

    public void run() { 
     /* do what you need */ 
    } 

}, 0, TimeUnit.SECONDS); 

그러나 당신이 지정한대로, 당신은 여전히 ​​것 반환 된 값을 위해 무언가를 할 필요가있다. 여러분이 할 수있는 일은별로 없으며, 상태 관리자로부터 무언가를 사용하거나 runnable 내의 관련 메소드를 실행하는 것 이외에는 할 수 없습니다.

+0

Pedantic,하지만'submit'을 사용합니다. 일정이 아닙니다. OP는 "예약 된"실행자 서비스에 대한 필요성을 나타내지 않았습니다. – djechlin

+0

또한 완료시 약속을 반환하는 문제를 해결해야합니다. – djechlin