Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java InputStream-关闭、中断阻塞读取()_Java_Netbeans_Concurrency_Io - Fatal编程技术网

Java InputStream-关闭、中断阻塞读取()

Java InputStream-关闭、中断阻塞读取(),java,netbeans,concurrency,io,Java,Netbeans,Concurrency,Io,一些输入输出对象,如InputStream,在读、写过程中不能被中断,也不能关闭源 例如: class InputStreamOperation1 implements Runnable { static InputStream stream; InputStreamOperation1(InputStream stream) { this.stream = stream; } public void run() { System.out.pr

一些输入输出对象,如
InputStream
,在读、写过程中不能被中断,也不能关闭源

例如:

class InputStreamOperation1 implements Runnable
{
    static InputStream stream;

    InputStreamOperation1(InputStream stream) { this.stream = stream; }

    public void run()
    {
        System.out.println("InputStreamOperation - the beginning");
        try
        {
            stream.read(); //blocking operation
        } catch (Exception e)
        {
            System.out.println("InputStreamOperation interrupted");
        }
        System.out.println("InputStreamOperation - the end");
    }
}
试图中断:

ExecutorService executor = Executors.newCachedThreadPool();
Future<?> f = executor.submit(new InputStreamOperation1(System.in));
TimeUnit.MILLISECONDS.sleep(100);
System.out.println("Interrupting InputStream");
f.cancel(true); // Interrupts if running
System.out.println("Interrupt sent to InputStream");
ExecutorService executor=Executors.newCachedThreadPool();
Future f=执行者提交(新输入流操作1(系统中));
时间单位。毫秒。睡眠(100);
System.out.println(“中断输入流”);
f、 取消(真);//运行时中断
System.out.println(“发送到InputStream的中断”);
试图关闭源文件

Future<?> f = executor.submit(new InputStreamOperation1(System.in));
TimeUnit.MILLISECONDS.sleep(100);
System.out.println("Closing source in InpuStream");
try
{
      System.in.close();
} catch (IOException e)
{
      System.out.println("Error during closing InputStreamOperation");
}
System.out.println("Closed source in InputStream");
Future f=executor.submit(新输入流操作1(System.in));
时间单位。毫秒。睡眠(100);
System.out.println(“在InpuStream中关闭源”);
尝试
{
System.in.close();
}捕获(IOE异常)
{
System.out.println(“关闭InputStreamOperation时出错”);
}
System.out.println(“输入流中的封闭源”);
两种解决方案都不起作用。它在读到至少一个字母后中断或关闭

我的问题:在这个阻塞操作期间,有没有办法中断阻塞
read()
操作或关闭源代码

我在这里发现了类似的东西-。我想知道是否有其他解决方案(特别是中断或关闭源代码)来停止线程,或者是唯一一个以这种复杂方式连接的解决方案

两种解决方案都不起作用。它在读到至少一个字母后中断或关闭

我可以在中关闭
系统

我的输出显示:

InputStreamOperation - the beginning
Closing source in InpuStream
Closed source in InputStream
read: -1
InputStreamOperation - the end
我添加了一个读取结果的打印,当我在另一个线程中关闭
系统时,它显示
-1
表示EOF

我想知道您的问题是否在于您没有关闭
Executor服务
?如果您不这样做,那么您的应用程序将无法完成

ExecutorService executor = Executors.newCachedThreadPool();
Future<?> f = executor.submit(new InputStreamOperation1(System.in));
executor.shutdown();
ExecutorService executor=Executors.newCachedThreadPool();
Future f=执行者提交(新输入流操作1(系统中));
executor.shutdown();
如果它仍然不适用于您,那么这必须依赖于操作系统。它在OSX和Linux下为我工作

我的问题:在这个阻塞操作期间,有没有办法中断阻塞read()操作或关闭源代码

除了关闭对我来说一直有效的流之外,我知道的唯一其他方法是使用NIO
interruptbleChannel
类并中断它

编辑:

ExecutorService executor = Executors.newCachedThreadPool();
Future<?> f = executor.submit(new InputStreamOperation1(System.in));
TimeUnit.MILLISECONDS.sleep(100);
System.out.println("Interrupting InputStream");
f.cancel(true); // Interrupts if running
System.out.println("Interrupt sent to InputStream");

从评论中可以看出,您是在Netbeans下工作的,可能是web包装程序出于安全目的保护系统。

这里有一个相关问题。@Andrew Longvinov是的,但是它与
interruptablechannel
连接,解决方案与另一个类的使用建议连接。我关闭
ExecutorService
。你用终端运行这个吗?我使用NetBeans运行它。可能,
System.in
在某种程度上有所不同。是的,它们可能不允许您访问真正的
System.in