异步多线程

时间:2012-10-14 11:08:16

标签: java

我有一个集中式套接字类,负责发送和检索数据。我有2个班级:

  • 一个侦听输入流和
  • 的人
  • 另一个负责写作的人。

在无限循环上运行侦听然后处理消息。对于同步i阻止读取并在我从服务器收到响应后重置这些值。

现在我陷入了无所事事的困境。我的服务有3种方法。

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

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

    看起来Future对象需要提交一个新任务,该任务将在其自己的线程中运行,但我设计此应用程序的方式,我只是无法创建新线程。任何人都可以给我一些见解,我应该如何处理这种asycnhronous,如流程图等?

2 个答案:

答案 0 :(得分:0)

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

您通常要做的是在异步工作完成时通知其他部分。为此,您需要使用"Observer Pattern"(文章包含流程图)。

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

/**
 * 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".
    }
}

答案 1 :(得分:0)

一些见解:

  • 您需要dataflow,而不是流程图

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

    创建的固定大小的线程池
  • 您无法在线程池中运行的任务中使用Future.get(),或者可能发生线程饥饿死锁。

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