开发者社区> 问答> 正文

java线程池结束任务,如何关闭任务中的读写流:报错

线程池中的任务是写文件操作,现在通过Future.cancel(true) 结束掉一个线程任务,此时任务在向一个文件写入操作。那线程被cancel后我需要把写了一半的文件删除掉,执行了File.delete(), 结果也是返回的true,但是硬盘文件仍然存在,我怀疑是不是线程任务cancel时,写入流没有关闭导致的?有没有大神帮忙解释下?这种情况我该如何成功删除文件呢?

展开
收起
kun坤 2020-06-09 11:12:59 823 0
1 条回答
写回答
取消 提交回答
  • Show your code######可以取巧一下,把操作的文件放入到Map中,然后一切都好办了。######请贴出你的代码,没代码怎么分析######线程任务被中断取消后文件写入流仍在执行,你删除文件仅仅删除前面已写的文件,证明你这个文件允许同时读写。你可以在中断线程任务后关闭文件写入流再删除文件。######是这样的,删除文件后,写入流仍在继续执行######java线程中断是协作是的,不是抢占式。说人话就是,你想中断线程,执行 Future.cancel(true)  你只是告诉它我要中断你了,至于中不中断要看执行线程有没有对interrupt进行处理,没有的话线程是不会中断,就算对interrupt进行处理,如果线程已经像你说的那样已经在写入文件了正常是无法中断的。######如果中断仅仅是想关闭流的话,可以每次执行任务起两个线程,通过一个标记将两个线程关联起来。一个执行任务,另一个循环获取interrupt消息。当线程执行完成之后发送interrupt消息告诉第二个线程我执行完了你可以终止了。当想终止线程的时候只要向第二个线程发送interrupt请求,第二个线程关闭第一个线程的流操作。这个时候虽然第一个线程还在执行,但是流已经被关闭了不知道会不会报异常,会的话try,catch一下。

    2020-06-09 11:13:04
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载