Java:如何中止从System.in中读取线程

| 我有一个Java线程:
class MyThread extends Thread {
  @Override
  public void run() {
    BufferedReader stdin =
        new BufferedReader(new InputStreamReader(System.in));
    String msg;
    try {
      while ((msg = stdin.readLine()) != null) {
        System.out.println(\"Got: \" + msg);
      }
      System.out.println(\"Aborted.\");
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }
}
} 在另一个线程中,如何中止该线程中的“ 1”调用,以便该线程显示“ 2”?我尝试过
System.in.close()
,但这没什么区别,
stdin.readline()
仍在阻塞。 我对没有 忙于等待(因为这会消耗100%的CPU); 睡眠(因为该程序不会立即响应
System.in
)。     
已邀请:
我的第一个反应是线程和
System.in
确实不在一起。 因此,首先将其拆分,以使线程代码不会碰到任何静态字符,包括
System.in
。 线程从
InputStream
读取并传递到缓冲区。将ѭ8传递到现有的线程中,该线程从缓冲区读取数据,但还检查您是否没有中止。     
Heinz Kabutz的通讯显示了如何使用缓冲区和
ExecutorService
中止
System.in
读取。 现在,我不知道这种方法是否会泄漏,是否可移植或是否有任何非显而易见的副作用。就个人而言,我不愿意使用它。 您也许可以使用NIO通道和文件描述符执行某些操作-我自己对它们的实验未产生任何结果。     
怎么样...
private static BufferedReader stdInCh = new BufferedReader(
    new InputStreamReader(Channels.newInputStream((
    new FileInputStream(FileDescriptor.in)).getChannel())));
现在调用
stdInch.readline()
的线程可以中断,并且readline()将抛出
java.nio.channels.ClosedByInterruptException
。     
用于BufferedReader.readLine的JavaDoc:   返回值:       包含行内容的字符串,不包含任何内容   行终止符,或为null   如果流的末尾是   到达 基于此,我认为它永远不会返回null(实际上System.in是否可以关闭,我不认为它会返回流的末尾吗?),因此while循环不会终止。停止线程的通常方法是在循环条件下使用布尔变量并从线程外部更改它,或调用Thread-objects的interrupt()方法(仅当线程为wait()时有效:或sleep():ing,或在引发InterruptedException的阻塞方法中)。您还可以使用isInterrupted()检查线程是否被中断。 编辑:这是一个使用
isInterrupted()
和ѭ16simple的简单实现。主线程在中断工作线程之前等待5秒钟。在这种情况下,工作线程基本上处于繁忙等待状态,所以并不是很好(一直循环并检查
stdin.ready()
,如果没有准备好输入,您当然可以让工作线程休眠一会儿):
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class MyThreadTest
{
    public static void main(String[] args)
    {
        MyThread myThread = new MyThread();
        myThread.start();

        try
        {
            Thread.sleep(5000);
        }
        catch(InterruptedException e)
        {
            //Do nothing
        }

        myThread.interrupt();

    }

    private static class MyThread extends Thread
    {       
        @Override
        public void run()
        {
            BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
            String msg;

            while(!isInterrupted())
            {
                try
                {
                    if(stdin.ready())
                    {
                        msg = stdin.readLine();
                        System.out.println(\"Got: \" + msg);
                    }
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }
            }           
            System.out.println(\"Aborted.\");
        }
    }

}
如果BufferedReader在读取行中被阻塞,或者似乎至少我找不到一个(使用System.in),似乎没有办法真正中断BufferedReader。     
你有没有尝试过:
Thread myThread = new MyThread();
myThread.start();
// your code.
myThread.interrupt();
中断方法将引发一个InterrupedtException,您可以在此之后处理代码。     
在上面的线程类定义中定义字段的方法如下:
class MyThread extends Thread {   

  protected AtomicBoolean abortThread = new AtomicBoolean(false);

  public void doAbort()
  {
    this.abortThread.set(true);
  }

  @Override   public void run() 
  { 
    ...
    if (this.abortThread.get())
    {
      ...something like break loop...
    }
  }
}
    

要回复问题请先登录注册