我'我试图通过ScheduledExecutorService
在Android中实现生产者 - 消费者模式。所以,我创建了一个生产者工作线程,它从网站和消费者线程加载数据,过滤这些数据。这是一个代码片段,用于演示我的问题:
public void RunPeriodicBackgroundTasks() {
private final ScheduledExecutorService backgroundTaskExecutor_ = Executors.newScheduledThreadPool(2);
backgroundTaskExecutor_.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
LinkedHashMap<String, Object> result_ = new LinkedHashMap<String, Object>(lowLevelNetworkOperation_.executeServerCommand(DASHBOARD_INBOX_SENT_COMMAND, params));
}
},1 ,3, SECONDS);
//AND NOW I CREATE ANOTHER THREAD for the second task
backgroundTaskExecutor_.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
//HERE I WANT To USE result_
}
}, 1,3, SECONDS);
}
答案 0 :(得分:2)
您可以在此处使用ConcurrentLinkedQueue。
使用您的第一个run
方法。
private final ConcurrentLinkedQueue<Map.Entry<String,Object>> queue = new ConcurrentLinkedQueue<Map.Entry<String,Object>>();
public void run(){
LinkedHashMap<String, Object> result_ = new LinkedHashMap<String, Object>(lowLevelNetworkOperation_.executeServerCommand(DASHBOARD_INBOX_SENT_COMMAND, params));
for(Map.Entry<String,Object> entry: result_.entrySet()){
queue.offer(entry);
}
}
在你的另一场比赛中
public void run(){
List<Map.Entry> currentEntries = new ArrayList<Map.Entry>();
Map.Entry entry = null;
while((entry = queue.poll())!=null){
currentEntries.add(entry);
}
//use it now
}
现在您会注意到这违反了生产者/消费者模式,因为您的两个主题是以固定费率安排的。这意味着它将定期唤醒/运行/一次又一次地睡眠。 ConcurrentLinkedQueue不会阻塞,因此如果Queue中没有元素,它将返回null。
如果你想让它成为真正的生产者/消费者,你可以安排第一个任务,但是第二个任务会等待队列信号唤醒。
final BlockingQueue<Map.Entry>queue = new LinkedBlockingQueue<Map.Entry>();
//This is your second run
public void run(){
while(!Thread.currentThread().isInterrupted()){
Map.Entry current = queue.take(); //suspend here if the queue is empty until it 1 or more elements
//use current
}
}