在线程上设置中断标志

时间:2017-12-01 12:47:49

标签: java multithreading

对于以下代码,

static class SleeperThread  extends Thread {
  public void run() {
    int c;
    try {
        c = System.in.read();
    }
    ...
  }
}

如此bug中所述,如果线程在IO(System.in.read();)上被阻止,那么,是否可以通过另一个线程在该线程上设置中断标志?

1 个答案:

答案 0 :(得分:1)

由于System.in对线程中断没有反应,你必须自己实现类似的东西。

为此,您可以使用available()System.in)的方法InputStream

看起来可能有点像这样:

class ReadWithInterrupt extends Thread{
    private byte[] result = null;
    public byte[] getResult(){
        return result;
    }

    @Override
    public void run(){
        try{
            while(true){
                if (this.isInterrupted()){
                    System.out.println("An interrupt occurred");
                    break;
                }
                int available = System.in.available();
                if (available>0){
                    result = new byte[available];
                    System.in.read(result, 0, available);
                    break;
                }
                else
                    Thread.sleep(500);
            }

        }
        catch (IOException e){
            e.printStackTrace();
        }
        catch (InterruptedException e){
            System.out.println("An interrupt occurred");
        }
    }
}
相关问题