httpclient這個工具類對於大家來說應該都不陌生吧,最近在使用過程中出現了碰到一個棘手的問題,當請求的接口地址由http變成https之后,程序執行到
httpClient.execute(httpPost);的時候經常會卡死(程序無響應),這個問題的根本原因是第三方接口一直沒有返回數據
程序需要收到反饋才能進行下一步操作,這也直接導致程序一直處於卡死狀態。
百度了很多資料,基本都是說設置下超時時間就可以
但是問題還是沒有得到解決,,,,,
最后本人想到一個解決辦法,將調度方法單獨放在線程中去執行,
調用 interrupt()方法,將線程處於中斷狀態
調用interrupted(),清除當前線程的中斷位
上述辦法本人親測,可以完美解決httpclient卡死的問題。
結論:interrupt方法是用於中斷線程的,調用該方法的線程的狀態將被置為"中斷"狀態。注意:線程中斷僅僅是設置線程的中斷狀態位,不會停止線程。所以當一個線程處於中斷狀態時,如果再由wait、sleep以及jion三個方法引起的阻塞,那么JVM會將線程的中斷標志重新設置為false,並拋出一個InterruptedException異常,然后開發人員可以中斷狀態位“的本質作用-----就是程序員根據try-catch功能塊捕捉jvm拋出的InterruptedException異常來做各種處理,比如如何退出線程。總之interrupt的作用就是需要用戶自己去監視線程的狀態位並做處理。”
以下供大家參考:
Thread.currentThread().interrupt(); 這個用於清除中斷狀態,這樣下次調用Thread.interrupted()方法時就會一直返回為true,因為中斷標志已經被恢復了。 而調用isInterrupted()只是簡單的查詢中斷狀態,不會對狀態進行修改。 interrupt()是用來設置中斷狀態的。返回true說明中斷狀態被設置了而不是被清除了。我們調用sleep、wait等此類可中斷(throw InterruptedException)方法時,一旦方法拋出InterruptedException,當前調用該方法的線程的中斷狀態就會被jvm自動清除了,就是說我們調用該線程的isInterrupted 方法時是返回false。如果你想保持中斷狀態,可以再次調用interrupt方法設置中斷狀態。這樣做的原因是,java的中斷並不是真正的中斷線程,而只設置標志位(中斷位)來通知用戶。如果你捕獲到中斷異常,說明當前線程已經被中斷,不需要繼續保持中斷位。 interrupted是靜態方法,返回的是當前線程的中斷狀態。例如,如果當前線程被中斷(沒有拋出中斷異常,否則中斷狀態就會被清除),你調用interrupted方法,第一次會返回true。然后,當前線程的中斷狀態被方法內部清除了。第二次調用時就會返回false。如果你剛開始一直調用isInterrupted,則會一直返回true,除非中間線程的中斷狀態被其他操作清除了。
最后跟大家提一下,當線程中的代碼執行結束之后,該線程就會關閉。