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()操作或关闭源代码
除了关闭对我来说一直有效的流之外,我知道的唯一其他方法是使用NIOinterruptbleChannel
类并中断它
编辑:
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
。