0

我有一个集中的套接字类,负责发送和检索数据。我有 2 节课:

  • 一个监听输入流和
  • 另一个负责写入它。

监听在无限循环上运行,然后处理消息。对于同步,一旦我收到来自服务器的响应,我就会阻止读取并重置这些值。

现在我被异步困住了。我的服务中有 3 种方法。

  1. 取得一些东西
  2. 读东西
  3. 说些什么。

在我的getSomething我想实现基于提供的布尔标志的异步功能。当我的应用程序启动时,我也会启动我的两个线程,如果我发送并发请求。

例如readSomething,首先然后我得到不是我想要getSomething的返回值,readSomething我可以在日志中看到输出在一段时间后出现。getSomethinggetSomething

看起来 Future 对象需要提交一个新任务,该任务将在它自己的线程中运行,但是我设计这个应用程序的方式,我无法创建一个新线程。谁能给我一些关于我应该如何处理这种异步(如流程图等)的见解?

4

2 回答 2

0

如果您正在异步工作,这意味着应用程序的其他部分不关心异步工作何时完成。

您通常想要做的是在异步工作完成时通知另一部分。为此,您需要使用“观察者模式”(文章包括流程图)。

基本思想是,您的应用程序启动异步工作并在工作完成时收到通知。这样,您可以松散地耦合应用程序的两个部分。一个简单的例子:

/**
 * The observer
 */
public interface AsyncWorkDoneListener{

    /**
     * This method will be called when the async-thread is
     *  done.
     */
    public void done(Object unit);

}

/**
 * The worker (which does the asyc-work on another thread).
 */
public class AsyncWorker{

    private AsyncWorkDoneListener listener;

    /**
     * Set (you might want to maintain a list here) the current
     *  listener for this "AsyncWorker".
     */
    public void setListener(AsyncWorkDoneListener listener){
        this.listener = listener;
    }

    /**
     * Will do the async-work
     */
    public void doWork(){
        // Do the work in another thread...
        // When done, notify the registered listener with the
        //  result of the async work:
        this.listener.done(the_object_containing_the_result);
    }
}

/**
 * The application
 */
public class App implements AsyncWorkDoneListener{

    public void someMethod(){
        // Work on something asynchronously:
        mAsyncWorker.setListener(this);
        mAsyncWorker.doWork();
    }

    @Override
    public void done(Object unit){
        // The asyc work has finished, do something with
        //  the result in "unit".
    }
}
于 2012-10-14T11:33:34.443 回答
0

一些见解:

  • 你需要数据流,而不是流程图

  • 如果您无法为每个任务创建新线程,则可以使用由java.util.concurrent.Executors.newFixedThreadPool()

  • 您不能在线程池中运行的任务中使用 Future.get(),否则可能会发生线程饥饿死锁。

  • 您对问题的描述不清楚:未声明的概念太多。“重置这些值” - 什么值?“我的服务中的 3 种方法” - 是服务器端还是客户端?“提供的布尔标志” - 我们是否需要了解谁提供了该标志以及它是什么意思?请提供您需要实施的程序的数据流表示,以便我们为您提供帮助。

于 2012-10-14T12:58:02.097 回答