2015-07-10 24 views
0

我有一個調用外部應用程序的Restful Service。此應用程序正在使我的服務掛起。因此,當用戶撥打我的服務時,由於此外部應用程序可能需要一個小時。外部應用程序只需要幾秒鐘執行。否則,出現了問題。所以我想讓我的服務中的代碼執行長達30秒。如果它通過了30秒的標記,我想停止服務並重新啓動它。在30秒內停止線程並重試

這裏就是我想:

public static void main(String[] args){ 

    Thread thread = new Thread(){ 
     public void run(){ 
      System.out.println("Hello Thread"); 
     } 
    }; 

    thread.start(); 

    //if thread is alive in 30 seconds, stop and retry 

} 

我不想要執行的代碼每30秒。我希望能夠停止代碼執行並從頭開始重新啓動它。

這裏的服務:

@Path("/test") 
@GET 
@Produces(MediaType.APPLICATION_JSON) 
public Response test(@QueryParam("input") String input) { 
    //call external application... if it hangs, it will take more than 30 seconds... 

} 

回答

0
+0

我已經研究過這個嘗試,但沒有運氣。你能舉個例子說明你的意思嗎? –

+0

@ChrisBolton http://www.mkyong.com/java/jdk-timer-scheduler-example/就是一個很好的例子。計時器創建自己的線程,因此您不需要。 – ajpaparo

+0

http://stackoverflow.com/questions/10029831/how-do-you-use-a-timertask-to-run-a-thread另一個很好的例子給你。 – ajpaparo

1

你說的是Timeout,對不對?

我在這個類中普遍實現了TimeoutCmd接口的方式是關閉您正在嘗試讀取的InputStream。這將引發異常並釋放正在等待的線程。

其他時候,使用了Thread.interrupt可以在停止長期運行線程有效的,如果它檢查上了Thread.interrupt值週期性

+0

所以我想讓我的客戶直接調用我的服務,而不是實例化任何東西。所以我在如何使用我的服務實施這個問題方面遇到問題。也許我應該做一個內心階層? –