簡體   English   中英

從readLine()喚醒線程(從System.in,沒有套接字)

[英]wake up thread from readLine() (from System.in , No socket )

我有2個線程: mainThread2

首頁 - >創建線程2,睡眠3秒,退出。

Thread2- >從System.in 讀取行並退出。

我想喚醒Thread2(如果它在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秒后)

退出睡眠

出口主

但是Thread2不間斷->它在讀取行中被阻塞。 為什么?

您可以將線程設置為守護進程:

tt.setDaemon(true);

醫生說:

將此線程標記為守護程序線程或用戶線程。 當僅運行的所有線程都是守護程序線程時,Java虛擬機將退出。

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

這里有兩個選項:

  1. 正如其他人所建議的那樣,您必須以某種方式強制關閉輸入流
  2. 您可以退后一步,並考慮重新設計整個過程:Java為您提供了執行非阻塞 IO的技術。 您可以在這里尋求一些初步指導。

當然,這實際上取決於您的上下文,兩者中哪一個更有意義。 選項2當然意味着截然不同的方法。 但另一方面:如果您不想阻止讀取,那就好了:您不應阻止讀取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM