Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何设计Java库中大量I/O进程的可取消API?_Java_Multithreading - Fatal编程技术网

如何设计Java库中大量I/O进程的可取消API?

如何设计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()

编辑2:这个问题的目的是

当API有更多的逻辑(例如:更多的I/O或网络连接)时,我们不需要在这些I/O或网络逻辑中插入布尔标志条件来知道它是否被取消


编辑_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;
}