第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

關(guān)于Socket read掛起的一些疑問?

關(guān)于Socket read掛起的一些疑問?

元芳怎么了 2019-01-30 18:34:07
有這么一個(gè)線程類(extends Thread)run方法中有如下代碼 while(true) { Socket socket = null; GZIPInputStream gzis = null; ObjectInputStream ois = null; try { socket = new Socket(IP, PORT); gzis = new GZIPInputStream(socket.getInputStream()); ois = new ObjectInputStream(gzis); Map<Integer, Object> result = (Map<Integer, Object>) ois.readObject(); doSomeBuziness(result); } catch(Exception e) { log.error(...); } finally { // clean work here sleep(1000); } } 即線程啟動(dòng)后 每隔1秒 從Socket服務(wù)端接收數(shù)據(jù) 然后對接收到的數(shù)據(jù)做些業(yè)務(wù)邏輯處理 突然發(fā)現(xiàn)數(shù)據(jù)好像一直沒有更新 通過jstack命令 可知該線程已經(jīng)掛起了 "Thread-5" daemon prio=10 tid=0x00002b54800cd000 nid=0x691f runnable [0x00002b5433be7000] java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:152) at java.net.SocketInputStream.read(SocketInputStream.java:122) at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:238) at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158) at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:116) 問: 為什么線程都掛起了 還是 RUNNABLE 狀態(tài)呢? 不是BLOCKED狀態(tài)呢? 這種掛起的底層機(jī)制是什么? 如對應(yīng)什么系統(tǒng)命令 和下面等待鎖釋放導(dǎo)致線程掛起的區(qū)別是什么(底層機(jī)制有什么不同) static synchronized void foo() { Thread.sleep(10*60*1000); } 如有一個(gè)加了同步塊的foo方法 兩個(gè)線程都去調(diào)用這個(gè)foo方法 其中一個(gè)會(huì)被阻塞 "pool-1-thread-2" prio=5 tid=0x00007f9ed00a5000 nid=0x5503 waiting for monitor entry [0x00007000079c7000] java.lang.Thread.State: BLOCKED (on object monitor) at com.demo.LockDemo.foo(LockDemo.java:24) - waiting to lock <0x00000007aae446d0> (a java.lang.Class for com.demo.LockDemo) at com.demo.LockDemo$1.run(LockDemo.java:15) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 針對Socket read的這種掛起 不想重啟應(yīng)用 有什么辦法可以人工顯式結(jié)束這種掛起嗎? at java.net.SocketInputStream.socketRead0(Native Method) 如 通過命令行顯式殺死這個(gè)socket 這樣的話可以拋個(gè)異常被捕獲 然后休眠一秒 可以繼續(xù)往下走了 不會(huì)卡住不動(dòng)了
查看完整描述

3 回答

?
慕村225694

TA貢獻(xiàn)1880條經(jīng)驗(yàn) 獲得超4個(gè)贊

你應(yīng)該好好JDK關(guān)于線程狀態(tài)的文檔java.lang.Thread.State

public enum State {
    /**
     * Thread state for a thread which has not yet started.
     */
    NEW,
    /**
     * Thread state for a runnable thread.  A thread in the runnable
     * state is executing in the Java virtual machine but it may
     * be waiting for other resources from the operating system
     * such as processor.
     */
    RUNNABLE,
    /**
     * Thread state for a thread blocked waiting for a monitor lock.
     * A thread in the blocked state is waiting for a monitor lock
     * to enter a synchronized block/method or
     * reenter a synchronized block/method after calling
     * {@link Object#wait() Object.wait}.
     */
    BLOCKED,
    /**
     * Thread state for a waiting thread.
     * A thread is in the waiting state due to calling one of the
     * following methods:
     * <ul>
     *   <li>{@link Object#wait() Object.wait} with no timeout</li>
     *   <li>{@link #join() Thread.join} with no timeout</li>
     *   <li>{@link LockSupport#park() LockSupport.park}</li>
     * </ul>
     *
     * <p>A thread in the waiting state is waiting for another thread to
     * perform a particular action.
     *
     * For example, a thread that has called <tt>Object.wait()</tt>
     * on an object is waiting for another thread to call
     * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
     * that object. A thread that has called <tt>Thread.join()</tt>
     * is waiting for a specified thread to terminate.
     */
    WAITING,
    /**
     * Thread state for a waiting thread with a specified waiting time.
     * A thread is in the timed waiting state due to calling one of
     * the following methods with a specified positive waiting time:
     * <ul>
     *   <li>{@link #sleep Thread.sleep}</li>
     *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
     *   <li>{@link #join(long) Thread.join} with timeout</li>
     *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
     *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
     * </ul>
     */
    TIMED_WAITING,
    /**
     * Thread state for a terminated thread.
     * The thread has completed execution.
     */
    TERMINATED;
}

RUNNABLE狀態(tài)指的是,線程正在JVM中運(yùn)行,但是它們需要等待來自操作系統(tǒng)的資源,比如說CPU資源,這里當(dāng)然是網(wǎng)絡(luò)資源,所以它本該就是RUNNABLE的。BLOCKED狀態(tài),專門指的是線程正在等待內(nèi)置鎖的過程。WAITING說明線程正在等待另一個(gè)線程的特定操作。

想要結(jié)束這種等待,要么給與線程所需要的網(wǎng)絡(luò)資源(這種控制不了),要么直接關(guān)閉Socket,或者調(diào)用interrupt方法(其實(shí)底層也是關(guān)閉Socket,可以看看interruptAPI文檔)。

查看完整回答
反對 回復(fù) 2019-03-01
?
哆啦的時(shí)光機(jī)

TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊

我覺得設(shè)置 socket 的超時(shí)時(shí)間比較合適, 如

socket = new Socket(IP, PORT);
socket.setSoTimeout(1000 * 60);  // 讀操作的超時(shí)時(shí)間為 60 秒

如此, 當(dāng) socket read 在超過 60秒沒有收到數(shù)據(jù)時(shí), 將拋出 SocketException 異常.

另外, 在 try finally 中應(yīng)釋放資源(關(guān)閉 socket).

查看完整回答
反對 回復(fù) 2019-03-01
  • 3 回答
  • 0 關(guān)注
  • 724 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)