从readLine()唤醒线程(来自System.in,没有套接字)

时间:2016-07-25 12:08:24

标签: java multithreading nio system.in

我有2个主题:主要主题2

主要 - >创建Thread2,休眠3秒,退出。

线程2 - >从System.in读取并退出。

我想唤醒Thread2,如果它在readline中阻塞(),我不想使用超时,并通过在Thread2中生成异常来关闭主输入流&# 39;工作。

代码:

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)

-read Thread

(3秒后)

- 退出睡眠

-exit main

但是Thread2不停 - >它在readline中是块。为什么呢?

2 个答案:

答案 0 :(得分:0)

您可以将线程设置为deamon:

tt.setDaemon(true);

医生说:

  

将此线程标记为守护程序线程或用户线程。当运行的唯一线程都是守护程序线程时,Java虚拟机将退出。

在你的情况下,当主线程结束时,tt将停止运行。

答案 1 :(得分:0)

这里有两个选项:

  1. 正如其他人所建议的那样,你不得不强行关闭你的输入流
  2. 您可以退一步,考虑重新设计整个事物:Java为您提供了非阻塞 IO的技术。您可以转动here获取初步指导。
  3. 当然,这实际上取决于你的背景,这两者更有意义。选项2当然意味着一种非常不同的方法;但另一方面:如果你不想阻止读取,那么:你不应该阻止读取。