2012-08-07 3 views
2

기본 질문 일 수 있지만이 포럼에서 확인을 얻고 싶습니다.동기화 된 블록 내에서 새 스레드 시작

public Object method1() { 
synchronized(this) { 
    method2(); 
    method3(); 
    method4(); 
} 

method4()은 시간이 많이 소요 내가이 완료 기다릴 필요가 없습니다 :

나는 아래의 코드 논리를 가지고있다. 그래서 스프링 메서드 인터셉터를 작성하여 호출을 가로 채고 별도의 스레드에서 실행합니다. 이제 내 질문은 method1 실행은 메소드 4 실행이 시작된 직후에 반환 될 것인가? 진술

public Object invoke(MethodInvocation methodInvocation) throws Throwable { 
    Future<Object> future = executorService.submit(new AsyncCallable(
      methodInvocation)); 
    Object retVal = null; 
    try { 
     retVal = future.get(10, TimeUnit.SECONDS); 
    } catch (Exception e) { 
     logger.error("Exception while running the method Async", e); 
     throw e; 
    } 
    return retVal; 
} //AsyncCallable implements Callable interface 
+0

다른 스레드에서 시작하지만 즉시 기다리지 않습니까? – Gray

+0

이것은 쉽게 실행할 수 있고 어떤 일이 발생하는지 볼 수 있습니다. 시도 해봐! –

+0

확인. 나는 method4()를 무한 루프에서 실행시켜 보았고 10 초 후에 타임 아웃했다. [나의 타임 아웃 한도]. 그래서 method1()은 쓰레드가 실행을 완료 할 때까지 기다린다. 나는 코드에서 무엇이 잘못되었는지 알지 못한다. 스레드를 비동기로 만들 수 있습니까? – gad

답변

2

: method4()은 시간이 많이 소요 내가이 완료 기다릴 필요가 없습니다

다음은 인터셉터 코드입니다.

좋습니다. 스레딩은 좋은 해결책입니다. 그러나, 바로 그 성명서에 의하면, 당신이 원하는 것이 즉각적인 반환을위한 것이라고 제안했는데, 즉시 즉각적으로 동기화 된 블록을 빠져 나갈 것입니다.

그래서 첫 번째 질문 : 당신이 정말로 원하는 것은 무엇입니까? 어쩌면 ... 아마도. sychronized 블록 외부에서 을 처리하는 것이 안전하다면, 해당 블록 밖으로 이동하십시오. 만약 안전하지 않다면, 당신이 원하는 것은 인터셉트 (그리고 쓰레드) method1일까요? method4 다시 한편


: 코딩으로, 당신의 요격 단계는, 미래를 만든 다음 미래 완료 10 초까지에 대한 기다립니다. 인터셉트는 그 이후에 완료됩니다 (완료 또는 시간 초과). 제어가 method1로 다시 전달되고 블록/동기화 루프가 종료됩니다.

+0

동기화 블록이없는 경우 method1()이 즉시 복귀합니까? – gad

+0

@ 가네시 아니, 그럴 수 없어. – oldrinb

+0

도움 주셔서 감사합니다. 앞으로 기다리지 않으면 method1이 즉시 반환됩니다. – gad