Java 授权给线程,同时保持线性可读性
我一直在尝试不同的方法来处理具有断开连接结果的阻塞方法,同时保持可能已中断的状态。我发现处理发送和接收很难协调的完全不同的类和方法是令人沮丧的 在下面的示例中,Java 授权给线程,同时保持线性可读性,java,multithreading,asynchronous,completable-future,Java,Multithreading,Asynchronous,Completable Future,我一直在尝试不同的方法来处理具有断开连接结果的阻塞方法,同时保持可能已中断的状态。我发现处理发送和接收很难协调的完全不同的类和方法是令人沮丧的 在下面的示例中,SomeBlockingMethod()通常返回void,因为消息被发送到其他进程。但是我让它与接收结果的侦听器同步。通过将其旋转到线程,我可以wait()等待超时或无限期的结果 这很好,因为一旦返回结果,我就可以继续处理特定的状态,在等待线程任务的结果时,我必须暂停该状态 我的方法有什么问题吗 尽管这个问题看起来很一般,但我还是特别想了
SomeBlockingMethod()
通常返回void
,因为消息被发送到其他进程。但是我让它与接收结果的侦听器同步。通过将其旋转到线程,我可以wait()
等待超时或无限期的结果
这很好,因为一旦返回结果,我就可以继续处理特定的状态,在等待线程任务的结果时,我必须暂停该状态
我的方法有什么问题吗
尽管这个问题看起来很一般,但我还是特别想了解一下Java中的线程技术
伪代码示例:
public class SomeClass implements Command {
@Override
public void onCommand() {
Object stateObject = new SomeObjectWithState();
// Do things with stateObject
Runnable rasync = () -> {
Object r = SomeBlockingMethod();
// Blocking method timed out
if (r == null)
return;
Runnable rsync = () -> {
// Continue operation on r which must be done synchronously
// Also do things with stateObject
};
Scheduler().run(rsync);
};
Scheduler().run(rasync);
}
使用CompletableFuture更新:
CompletableFuture<Object> f = CompletableFuture.supplyAsync(() -> {
return SomeBlockingMethod();
});
f.thenRun(() -> { () -> {
String r = null;
try {
r = f.get();
}
catch (Exception e) {
e.printStackTrace();
}
// Continue but done asynchronously
});
严格使用CompletableFuture
的问题在于CompletableFuture.thenAccept
是从全局线程池运行的,不能保证与调用线程同步
为同步任务重新添加计划程序修复了以下问题:
CompletableFuture.supplyAsync(() -> {
return SomeBlockingMethod();
}).thenAccept((
Object r) -> {
Runnable rsync = () -> {
// Continue operation on r which must be done synchronously
};
Scheduler().run(rsync);
});
与complete scheduler方法相比,使用Completable Future的一个警告是,存在于外部的任何以前的状态都必须是最终状态或有效的最终状态。您应该检查一下,它使用流操作并支持线程
api.getPeople()
.observeOn(Schedulers.computation())
.filter(p -> return p.isEmployee();)
.map(p -> return String.format("%s %s - %s", p.firstName(), p.lastName(), p.payrollNumber());)
.toList()
.observerOn(<ui scheudler>)
.subscirbe(p -> screen.setEmployees(p);)
api.getPeople()
.observeOn(Schedulers.computation())
.filter(p->return p.isEmployee();)
.map(p->return String.format(“%s%s-%s”,p.firstName(),p.lastName(),p.payrollNumber());)
托利斯先生()
.observerOn()
.subscibe(p->screen.setEmployees(p);)
CompletableFuture解决了这个问题。AdamSkywalker,自从查看您的评论以来,我对CompletableFuture做了大量研究,它彻底改变了我在Java中处理异步任务的方式。请将此作为答案提交,以便我可以奖励您的帮助。
api.getPeople()
.observeOn(Schedulers.computation())
.filter(p -> return p.isEmployee();)
.map(p -> return String.format("%s %s - %s", p.firstName(), p.lastName(), p.payrollNumber());)
.toList()
.observerOn(<ui scheudler>)
.subscirbe(p -> screen.setEmployees(p);)