如何设计Java库中大量I/O进程的可取消API?
编辑2:这个问题的目的是 当API有更多的逻辑(例如:更多的I/O或网络连接)时,我们不需要在这些I/O或网络逻辑中插入布尔标志条件来知道它是否被取消如何设计Java库中大量I/O进程的可取消API?,java,multithreading,Java,Multithreading,编辑2:这个问题的目的是 当API有更多的逻辑(例如:更多的I/O或网络连接)时,我们不需要在这些I/O或网络逻辑中插入布尔标志条件来知道它是否被取消 编辑_1:我将术语中断更改为取消,以避免混淆线程的中断概念 对不起,我误导了你 我有一个已经存在的API,它有很多IO进程。比如说 void heavyTask() { // Download File #1 with Network I/O HttpClient client1 = new HttpClient()
编辑_1:我将术语中断更改为取消,以避免混淆线程的中断概念 对不起,我误导了你
我有一个已经存在的API,它有很多IO进程。比如说
void heavyTask() {
// Download File #1 with Network I/O
HttpClient client1 = new HttpClient()
....
...
..
while() {
outputStream1.write()
}
// Save File #1 with File I/0
File file1 = new File();
....
...
..
// Download File #2 with Network I/O
HttpClient client2 = new HttpClient()
....
...
..
while() {
outputStream2.write()
}
// Save File #2 with File I/0
File file2 = new File();
...
..
}
我的想法是通过检查内部的取消标志来添加取消API
重任务
目前,标记方式是可行的,但我可以预期,当重任务变得更加复杂时,将出现更多的“检查标记条件”。
我还想制作一个特定的工作线程来处理重任务,
并在触发取消时调用工作线程的thread.interrupt()
然而,在对网络I/O案例进行了一些调查之后,即使触发了thread.interrupt(),在进行网络I/O处理时,它似乎仍然会阻塞。也许thread.interrupt()不是一种很好的实现方法
有没有一种简洁而智能的方法来设计一个可取消的重任务API
谢谢你也许应该了解真正的意义。您的实现错误。没有必要添加该标志。I/O方法通常是可中断的(如果它们经过仔细设计的话)。因此,如果您在一个单独的线程中运行
heavyTask
方法并中断该线程,您将立即得到所需的结果,您可以在每个线程中对小块数据进行操作,并在块之间达到中断状态时中断。如果您的繁重任务正在执行阻塞IO,并且当前被阻塞,则它将继续等待读取字节,这与您是否设置布尔标志有关。取消阻塞IO通常是通过关闭资源来完成的,您将在任务线程上获得IOException。感谢您的响应。这个问题的目的是当API有更多的逻辑(例如:更多的I/O或网络连接)时,我们不需要在这些I/O或网络逻辑中插入布尔标志条件,就可以知道它是否被取消。
volatile isCancelled = false;
void cancelHeavyTask() {
isCancelled = true;
}
void heavyTask() {
// Download File #1 with Network I/O
HttpClient client1 = new HttpClient()
....
...
..
while() {
outputStream1.write()
if (isCancelled == true) // Add isCancelled flag
return;
}
// Save File #1 with File I/0
File file1 = new File();
....
...
..
if (isCancelled == true) // Add isCancelled flag
return;
// Download File #2 with Network I/O
HttpClient client2 = new HttpClient()
....
...
..
while() {
outputStream2.write()
if (isCancelled == true) // Add isCancelled flag
return;
}
// Save File #2 with File I/0
File file2 = new File();
...
..
if (isCancelled == true) // Add isCancelled flag
return;
}