何时使用异步计算?

时间:2015-01-07 09:08:41

标签: java asynchronous nonblocking

我在下面的异步计算示例中展示:

//Create an Asynchronous channel. No connection has actually been established yet
 AsynchronousSocketChannel asynchronousSocketChannel = AsynchronousSocketChannel.open(); 

 /**Connect to an actual server on the given port and address. 
    The operation returns a   type of Future, the basis of the all asynchronous operations in java. In this case, a Void is returned because nothing is returned after a successful socket connection
     */
 Void connect = asynchronousSocketChannel.connect(new InetSocketAddress("127.0.0.1", 5000)).get();


 //Allocate data structures to use to communicate over the wire
 ByteBuffer helloBuffer = ByteBuffer.wrap("Hello !".getBytes()); 

 //Send the message

 Future<Integer> successfullyWritten=  asynchronousSocketChannel.write(helloBuffer);

  //Do some stuff here. The point here is that asynchronousSocketChannel.write() returns almost immediately, not waiting to actually finish writing the hello to the channel before returning control to the currently executing thread

 doSomethingElse();

 //now you can come back and check if it was all written (or not)

 System.out.println("Bytes written "+successfullyWritten.get());

我是异步计算的新手。但是我从你给出的例子中理解的是,异步做事的整个目的是并行化操作。在我们同步完成事务的情况下,write()和doSomethingElse()会连续发生。因此,选择异步计算的重要属性是:

1)doSomethingElse()不应该依赖于write()的输出。

2)write()和doSomethingElse()都应该是耗时的步骤,否则并行化是没有意义的。正确?

如果我的理解错误,请纠正我,并且我们通过计算中的异步步骤可以实现更多目标。

还可以介绍一种使用异步计算的最常见用例。

1 个答案:

答案 0 :(得分:2)

是的,基本上你使用异步计算来处理与其他任务并行运行的耗时任务,例如:你的线程。什么&#34;耗时&#34;虽然意思是定义问题,但在某些系统中,它可能意味着长度超过几毫秒。

作为一个例子,一些耗时的&#34;任务可能会阻止你的ui最新更新,这样你就可以异步运行该任务,即与ui更新并行运行(例如在Swing中这意味着使用worker而不是在事件派发线程中执行这些任务)。

数据的可用性只是是否使用异步或同步计算的次要指标。您可以推迟执行任务,直到所需数据可用(例如,通过使用Future或消息),并在此期间仍然进行其他计算(例如,ui更新)。

那就是说你应该仔细考虑如何为你的任务建模以减少开销(太多或太小的任务实际上可能会降低性能,不必要地阻塞资源,如CPU时间等)。如果数据的可用性本质上建议同步计算,那么这可能是要走的路。但是,你仍然可以有多个异步/并行进程,每个进程同步执行自己的任务。