2016-07-25 47 views
0

我有2個版本:主要線程2醒來從的readLine(線程)(從System.in,無插座)

主要 - >創建Thread2,睡3秒,退出。

Thread2 - > readline from System.in並退出。

我想喚醒線程2,如果它是在readline()中的塊,我不想使用超時,並且通過在Thread2中生成異常來關閉主輸入流不起作用。

的代碼:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.InterruptedIOException; 

public class Main {  
    public static void main(String[] args) throws InterruptedException { 
    InputStreamReader sc = new InputStreamReader(System.in); 

    Thread2 t = new Thread2(sc); 
    Thread tt = new Thread(t); 
    tt.start(); 

    Thread.sleep(3000); 
    System.out.println("exit sleep"); 

    tt.interrupt(); 
    System.out.println("exit main"); 
    } 
} 

class Thread2 implements Runnable { 
    InputStreamReader qst; 

    public Thread2(InputStreamReader sc) { 
    qst = sc; 
    } 
    public void run() { 
    BufferedReader buff = new BufferedReader(qst); 
    try { 
     System.out.println("read thread"); 

     buff.readLine(); //Here is locked!!!!!!!!!!!!!!!!!! 
    } catch (InterruptedIOException e) { 
     System.out.println("exit thread"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

執行(的println)

- 讀取線程

(後3秒)

-exit睡眠

-exit main

但是,線程2不停止 - >它是在readline中的塊。爲什麼?

回答

0

您可以將線程設置爲守護程序:

tt.setDaemon(true); 

的醫生說:

將該線程標記爲守護線程或用戶線程。當只有運行的線程都是守護進程線程時,Java虛擬機纔會退出。

在你的情況下,當主線程結束時,tt將停止運行。

+0

感謝這項工作! – John

0

有兩個選項:

  1. 正如其他人所建議的,你無論如何都必須強制關閉輸入流
  2. 您可以退後一步,並考慮重新設計你的整個事情:Java的爲您提供技巧非阻塞 IO。你可以打開here來獲得一些指導如何做到這一點。

當然,它確實取決於你的上下文哪一個更有意義。選項2當然意味着一種非常不同的方法;但另一方面:如果你不想阻塞讀取,那麼很好:你不應該在讀取時阻塞。

+0

感謝答案的2點,1點不起作用,也許是因爲inputstrem是非阻塞的,對吧? – John

+0

@John'System.in'沒有非阻塞I/O。 – EJP