用Java 实现一个异步任务 可终止,可中断,可继续功能

在 Java 中实现一个异步任务可以使用多线程和线程池技术,同时需要考虑终止、中断和继续等功能。下面展示一个简单的示例代码,实现异步任务的终止、中断和继续等功能:

```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class AsyncTask {
private ExecutorService executorService;
private Future<?> future;
private boolean paused = false;

public AsyncTask() {
executorService = Executors.newSingleThreadExecutor();
}

public void start(Runnable runnable) {
future = executorService.submit(() -> {
try {
runnable.run();
} catch (InterruptedException e) {
// 如果异步任务被中断,则直接结束
return;
}
});
}

public void stop() {
if (future != null) {
future.cancel(true);
}
}

public void pause() {
paused = true;
}

public void resume() {
paused = false;
}

public boolean isPaused() {
return paused;
}
}
```

上述代码中,`AsyncTask` 类封装了一个异步任务,其中 `executorService` 是一个线程池,`future` 为异步任务的返回结果,`paused` 表示异步任务是否处于暂停状态。

在 `start` 方法中启动异步任务,其中使用 try-catch 块捕获 `InterruptedException` 异常,以便在异步任务被中断时能够正确处理。在 `stop` 方法中终止异步任务,使用 `future` 变量的 `cancel` 方法来实现。在 `pause` 和 `resume` 方法中,通过设置 `paused` 变量的值来实现异步任务的暂停和继续。

在使用该异步任务时,可以创建一个 `Runnable` 对象并传递给 `start` 方法,例如:

```java
AsyncTask task = new AsyncTask();
task.start(() -> {
for (int i = 1; i <= 10; i++) {
if (task.isPaused()) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
i--;
continue;
}
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
});
```

上述代码中,异步任务是一个简单的计数器,每隔一秒钟输出一个数字,如果异步任务被暂停,则等待一秒钟后再继续执行。可以通过调用 `pause` 和 `resume` 方法来暂停和继续异步任务,例如:

```java
task.pause(); // 暂停异步任务
Thread.sleep(5000); // 等待 5 秒钟
task.resume(); // 继续异步任务
```

当异步任务被暂停时,计数器将暂停 5 秒钟,然后继续执行。可以使用 `stop` 方法来终止异步任务,例如:

```java
task.stop(); // 终止异步任务
```

posted @ 2023-03-30 11:09  小飞fei  阅读(369)  评论(0)    收藏  举报