背景:
我正在创建一个我想要开源的库。 该库设计用于后端进程。 我将提供的服务利用 Java 的
ProcessBuilder
来执行多个本机命令。
该服务通常会在 1 秒内完成命令处理,但在极少数情况下,可能需要几分钟。
问题:
在公共库的方法可能会阻塞的情况下,库是否应该提供异步选项来调用该方法?或者这样的库应该保持不发表意见,并将其留给用户来实施?
以下是我一直在考虑如何实施这项服务的几种方法......
示例1:没有主见
SomeService
,带阻塞方式SomeService.java
public class SomeService {
public Response process(Request request) {
//do stuff for 60 seconds
}
}
示例2:固执己见
SomeService
,带阻塞方式SomeProcessTask
,用户可以利用它绕过阻塞方法并运行异步。SomeProcessTask.java
public class SomeProcessTask implements Callable<Response> {
private final Request request;
public SomeProcessTask(Request request) {
this.request = request;
}
@Override
public Response call(Request request) {
//do stuff for 60 seconds
}
}
SomeService.java
public class SomeService {
public Response process(Request request) {
SomeProcessTask task = new SomeProcessTask(request);
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Response> future = executor.submit(task);
return future.get();
}
}
您评论:
我对并发不太有经验
那么你绝对不应该尝试让你的库同时运行。并发是很棘手的。
保持你的库简单。专注于其核心目的。如果调用程序员认为并发很重要,则让他们处理并发。