Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA中如何在调度线程上实现等待和通知_Java_Multithreading_Producer Consumer_Scheduledexecutorservice - Fatal编程技术网

JAVA中如何在调度线程上实现等待和通知

JAVA中如何在调度线程上实现等待和通知,java,multithreading,producer-consumer,scheduledexecutorservice,Java,Multithreading,Producer Consumer,Scheduledexecutorservice,我有一个简单的问题。 我有一个调度线程,它会根据一些条件在列表上执行一些操作。 现在的问题是,当用户选择输入“2”时,调度线程必须等待,当工作完成时,调度线程必须再次启动其进程。这就像一个简单的生产者和消费者问题。但我对调度程序线程感到困惑。提前谢谢。 代码如下: package sample; public class Sample { /** * @param args the command line arguments */ List<Str

我有一个简单的问题。 我有一个调度线程,它会根据一些条件在列表上执行一些操作。 现在的问题是,当用户选择输入“2”时,调度线程必须等待,当工作完成时,调度线程必须再次启动其进程。这就像一个简单的生产者和消费者问题。但我对调度程序线程感到困惑。提前谢谢。 代码如下:

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
    }
}

问题是,只要用户输入“2”,列表就会更新。当调度程序线程不断更新列表时。它可以通过迭代来删除元素。当多个用户输入“2”时,此场景会导致太多延迟。每个线程对列表进行操作,更新列表,同时调度程序线程更新列表。我无法使调度程序线程停止,因为它必须连续执行工作,但当用户输入“2”时,我可以做什么使调度程序线程暂停,直到用户操作完成?

一个简单的解决方案:让调度任务一直运行,但让它在每次唤醒时检查一个标志。如果将标志设置为一种方式,它将执行其常规工作,但如果将标志设置为另一种方式,它将不执行任何操作

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

请详细说明

  • 必须等待
    为什么
  • 工作完成了
    应该做什么
几点注意:

  • 如果要使用来自多个线程的列表,请使用线程安全版本,例如
    Collections.synchronizedList()
  • 如果希望计划任务等待,则不要使用
    scheduleAtFixedRate
    ,而是使用
    scheduleWithFixedDelay
  • Wait/notify自然要求线程持续运行,而不是按计划运行

  • 谢谢你,巴克斯。问题是,只要用户输入“2”,列表就会更新。当调度程序线程不断更新列表时。它可以通过迭代来删除元素。当多个用户输入“2”时,此场景会导致太多延迟。每个线程对列表进行操作,更新列表,同时调度程序线程更新列表。我无法使调度程序线程停止,因为它必须连续执行工作,但当用户输入“2”时,我可以如何使调度程序线程暂停,直到用户操作完成?
    package sample;
    
        public class Parallel implements Runnable{
    
            @Override
            public void run(){
                System.out.println("Inside thread");
                //do operations on list
            }
        }