如何在检查完所有进度标志后终止已进入资源密集型方法的java线程?
基本问题是从外部安全地终止线程 事件调度线程(EDT)生成新的工作线程(workerThread)。此workerThread必须完成一项任务。该任务在循环的几个迭代中完成每次迭代有两部分:读取数据(IO)和计算数据(摘要)。EDT可以随时通过workerThread代码中的布尔标志(flag_CANCEL)通知workerThread取消。问题是,唯一一次检查标志是在IO和/或摘要之后。这提供了到子迭代级别的即时取消 我想要的是IO或摘要期间的取消。重复检查Thread.interrupted与FLAG\u CANCEL checking相同。这不起作用。由于IO和Digest不抛出任何InterruptedException(也不能修改它们来抛出任何InterruptedException),workerThread.interrupt()不起作用(循环中的任何内容都不会被中断)如何在检查完所有进度标志后终止已进入资源密集型方法的java线程?,java,multithreading,Java,Multithreading,基本问题是从外部安全地终止线程 事件调度线程(EDT)生成新的工作线程(workerThread)。此workerThread必须完成一项任务。该任务在循环的几个迭代中完成每次迭代有两部分:读取数据(IO)和计算数据(摘要)。EDT可以随时通过workerThread代码中的布尔标志(flag_CANCEL)通知workerThread取消。问题是,唯一一次检查标志是在IO和/或摘要之后。这提供了到子迭代级别的即时取消 我想要的是IO或摘要期间的取消。重复检查Thread.interrupted
private final Runnable runnable= new Runnable() {
@Override
public void run() {
try {
//hasher is a global instance in EDT of Hasher class
hasher.hash(file);
} catch (NoSuchAlgorithmException ex) {
//do something
} catch (IOException ex) {
//do something
}
catch (InterruptedException ex) {
//do something
}
}
};
Thread workerThread=new Thread(runnable);
workerThread.setDaemon(true);
workerThread.start();
下面是类哈希器的方法
synchronized public String hash(File file) throws NoSuchAlgorithmException, FileNotFoundException, IOException
{
FLAG_CANCEL_HASHING = false;//global
byte[] buffer =new buffer[calculateBufferSize()];
MessageDigest md = MessageDigest.getInstance(algorithm);
FileInputStream fis = new FileInputStream(file);
int bytesRead;
float totalBytesRead = 0;
//start hashing
while ((bytesRead = fis.read(buffer)) != -1)//IO
{
//check before Digest
if (FLAG_CANCEL_HASHING)
{
fireCancellationEvent();
return null;
}
md.update(buffer, 0, bytesRead);//Digest
//check before IO
iif (FLAG_CANCEL_HASHING)
{
fireCancellationEvent();
return null;
}
totalBytesRead += bytesRead;
fireProgressEvent(totalBytesRead );
}
fis.close();
return toHexString(md.digest());
}
我是否可以调用workerThread.stop(),然后在下次调用runnable时安全地使用hasher
解决方案-这是否绝对足够(确保下次从EDT调用hasher时不会出错)
请记住,在资源密集型IO或摘要期间,所需的只是终止,以不影响对哈希器的任何后续调用的工作。例如,在通过stop终止线程后,调用rutime.getRuntime.gc是否会清理暴露的对象并防止下次调用hasher时出现任何不良行为?只是为了完整性:Java的InputStream.read()方法确实抛出InterruptedIOException-因此我认为interrupt()是在I/O线程上,等待将中止读取,并出现该异常…java.io.InputStream.read()的可能副本不会引发InterruptedIOException,但IOException..没有帮助(JDK1.8)[link]特定于正则表达式匹配(或其他)但是jist是一个线程,如果外部对象没有被访问,它就可以通过stop终止,这几乎从来都不是事实。例如,在这里,workerThread锁定hasher,即使我在stop杀死workerThread后重新初始化hasher,我对md.digest中暴露的内容一无所知,那又如何呢?对象曝光没有足够的约束条件来决定线程死亡,是吗?