How to stop a thread waiting in a blocking read operation in Java?

后端 未结 7 1903
萌比男神i
萌比男神i 2020-12-03 10:40

I have a thread that executes the following code:

public void run() {
    try {
        int n = 0;
        byte[] buffer = new byte[4096];
        while ((n          


        
相关标签:
7条回答
  • 2020-12-03 10:52

    This is because reading System.in (InputStream) is a blocking operation.

    Look here Is it possible to read from a InputStream with a timeout?

    0 讨论(0)
  • 2020-12-03 10:54

    You've stumbled upon a 9 year old bug no one is willing to fix. They say there are some workarounds in this bug report. Most probably, you'll need to find some other way to set timeout (busy waiting seems unavoidable).

    0 讨论(0)
  • 2020-12-03 10:55

    you can use a external flag for this

    boolean flag = true;
    
    
    public void run() { 
        try { 
            int n = 0; 
            byte[] buffer = new byte[4096]; 
            while ((n = in.read(buffer)) != -1 && flag) { 
                out.write(buffer, 0, n); 
                out.flush(); 
            } 
        } catch (IOException e) { 
            System.out.println(e); 
        } 
    } 
    
    0 讨论(0)
  • 2020-12-03 11:07

    If you want to give a user some time to enter data - maybe to allow overriding default values or interrupting some automated process -, then wait first and check available input after the pause:

    System.out.println("Enter value+ENTER within 5 Seconds to override default value: ");
    try{
      Thread.sleep(5000);
    } catch {InterruptedException e){}
    
    try{
      int bytes = System.in.available();
      if (bytes > 0) {
        System.out.println("Using user entered data ("+size+" bytes)");
      } else {
        System.out.println("Using default value"); 
      }
    } catch(IOException e) { /*handle*/ }
    
    0 讨论(0)
  • 2020-12-03 11:08

    Is it safe to close in stream in other thread? It works for me. In this case, in.read(...) throws exception SocketException.

    0 讨论(0)
  • 2020-12-03 11:10

    You could use the available() method (which is non-blocking) to check whether there is anything to read beforehand.

    In pseudo-java:

    //...
    while(running)
    {
        if(in.available() > 0)
        {
            n = in.read(buffer);
            //do stuff with the buffer
        }
        else
        {
            Thread.sleep(500);
        }
    }
    //when running set to false exit gracefully here...
    
    0 讨论(0)
提交回复
热议问题