我有一个简单的问题。 我有一个预定的线程,继续根据某些条件在列表上执行某些操作。 现在的问题是当用户输入' 2'作为他的选择,预定的线程必须等待,并且当工作完成时,预定的线程必须再次启动它的进程。这就像一个简单的生产者和消费者问题。但我对Scheduler线程感到困惑。提前致谢。 这是代码:
package sample;
public class Sample {
/**
* @param args the command line arguments
*/
List<String> list = new LinkedList<>();
public static void main(String[] args) throws IOException {
ScheduledExecutorService service = Executors.newScheduledThreadPool(5);
Parallel p = new Parallel();
service.scheduleAtFixedRate(p, 0, 1000, TimeUnit.SECONDS);
while (true) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
switch (br.read()) {
case 1:
newOrder();
break;
case 2:
replace();
break;
default:
break;
}
}
}
public static void newOrder() {
System.out.println("New Order ");
}
public static void replace() {
System.out.println("Replace");
// pause the scheduled thread
/*
perform actions on the list
*/
// notify the scheduled thread again
}
}
我的并行线程类:
package sample;
public class Parallel implements Runnable{
@Override
public void run(){
System.out.println("Inside thread");
//do operations on list
}
}
问题是,每当用户输入&#39; 2&#39;然后列表将更新。意味着调度程序线程继续更新列表。我通过迭代它删除一个元素。当多个用户输入“2”时,这种情况会造成太多延迟。并且每个线程都对列表进行更新,同时Scheduler线程正在更新列表。我无法使调度程序线程停止,因为它必须连续地执行工作,但是当用户输入&#39; 2&#39;如何使调度程序线程暂停直到用户操作完成?
答案 0 :(得分:1)
一个简单的解决方案:让计划任务一直运行,但每次唤醒时都要检查一个标志。如果标志是单向设置的,它会执行通常的工作,但如果标志设置为另一种方式则无效。
然后,UI只需根据任务是否“运行”来设置标志的值。
答案 1 :(得分:1)
请详细说明
has to wait
为什么?the work is done
该怎么做?几点说明:
Collections.synchronizedList()
scheduleAtFixedRate
,请改用scheduleWithFixedDelay
。