我有一个集中式套接字类,负责发送和检索数据。我有2个班级:
在无限循环上运行侦听然后处理消息。对于同步i阻止读取并在我从服务器收到响应后重置这些值。
现在我陷入了无所事事的困境。我的服务有3种方法。
在我的getSomething
我想基于提供的布尔标志实现异步功能。当我的应用程序启动时,我也启动我的两个线程,如果我发送并发请求。
例如首先readSomething
然后getSomething
然后我在readSomething
中获得getSomething
的返回值,这不是我想要的,我可以在日志中看到getSomething
的输出会在一段时间后出现。
看起来Future对象需要提交一个新任务,该任务将在其自己的线程中运行,但我设计此应用程序的方式,我只是无法创建新线程。任何人都可以给我一些见解,我应该如何处理这种asycnhronous,如流程图等?
答案 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种方法” - 是服务器端还是客户端? “提供布尔标志” - 我们是否需要了解谁提供了该标志及其含义是什么? 请提供您需要实施的程序的数据流表示,以便我们为您提供帮助。