如何在JAVA中的预定线程上实现等待和通知

时间:2018-03-06 15:15:46

标签: java multithreading producer-consumer scheduledexecutorservice

我有一个简单的问题。 我有一个预定的线程,继续根据某些条件在列表上执行某些操作。 现在的问题是当用户输入' 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;如何使调度程序线程暂停直到用户操作完成?

2 个答案:

答案 0 :(得分:1)

一个简单的解决方案:让计划任务一直运行,但每次唤醒时都要检查一个标志。如果标志是单向设置的,它会执行通常的工作,但如果标志设置为另一种方式则无效。

然后,UI只需根据任务是否“运行”来设置标志的值。

答案 1 :(得分:1)

请详细说明

  • has to wait为什么?
  • the work is done该怎么做?

几点说明:

  1. 如果您想使用多个线程中的列表,请使用线程安全版本,例如: Collections.synchronizedList()
  2. 如果您希望计划任务等待,请不要使用scheduleAtFixedRate,请改用scheduleWithFixedDelay
  3. 等待/通知会自然要求连续运行的线程,而不是按计划运行。