线程池中的任务是写文件操作,现在通过Future.cancel(true) 结束掉一个线程任务,此时任务在向一个文件写入操作。那线程被cancel后我需要把写了一半的文件删除掉,执行了File.delete(), 结果也是返回的true,但是硬盘文件仍然存在,我怀疑是不是线程任务cancel时,写入流没有关闭导致的?有没有大神帮忙解释下?这种情况我该如何成功删除文件呢?
Show your code######可以取巧一下,把操作的文件放入到Map中,然后一切都好办了。######请贴出你的代码,没代码怎么分析######线程任务被中断取消后文件写入流仍在执行,你删除文件仅仅删除前面已写的文件,证明你这个文件允许同时读写。你可以在中断线程任务后关闭文件写入流再删除文件。######是这样的,删除文件后,写入流仍在继续执行######java线程中断是协作是的,不是抢占式。说人话就是,你想中断线程,执行 Future.cancel(true) 你只是告诉它我要中断你了,至于中不中断要看执行线程有没有对interrupt进行处理,没有的话线程是不会中断,就算对interrupt进行处理,如果线程已经像你说的那样已经在写入文件了正常是无法中断的。######如果中断仅仅是想关闭流的话,可以每次执行任务起两个线程,通过一个标记将两个线程关联起来。一个执行任务,另一个循环获取interrupt消息。当线程执行完成之后发送interrupt消息告诉第二个线程我执行完了你可以终止了。当想终止线程的时候只要向第二个线程发送interrupt请求,第二个线程关闭第一个线程的流操作。这个时候虽然第一个线程还在执行,但是流已经被关闭了不知道会不会报异常,会的话try,catch一下。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。