Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.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_Events_Wait_Synchronized - Fatal编程技术网

Java 增加睡眠/等待时间,直到需要

Java 增加睡眠/等待时间,直到需要,java,multithreading,events,wait,synchronized,Java,Multithreading,Events,Wait,Synchronized,我不太擅长多线程,这可能是一个基本问题。但我一直找不到答案 场景: 假设我有一个事件侦听器,它被某个东西触发。每次触发事件时,我都要启动一个新线程,执行该线程大约需要3秒钟 问题: 问题是该事件可以在一秒钟内触发多次,我不想一次启动多个线程 要求: 我如何安排一个线程,比如说在活动后1000毫秒。如果事件继续触发,我希望继续延迟线程的计划时间。这样,我的线程在上次触发事件1000毫秒后执行。事件侦听器在启动时创建并启动一个新的私有线程。线程包含要执行的任务列表,并按顺序一次执行一个任务。每次偶数

我不太擅长多线程,这可能是一个基本问题。但我一直找不到答案

场景: 假设我有一个事件侦听器,它被某个东西触发。每次触发事件时,我都要启动一个新线程,执行该线程大约需要3秒钟

问题: 问题是该事件可以在一秒钟内触发多次,我不想一次启动多个线程

要求:
我如何安排一个线程,比如说在活动后1000毫秒。如果事件继续触发,我希望继续延迟线程的计划时间。这样,我的线程在上次触发事件1000毫秒后执行。

事件侦听器在启动时创建并启动一个新的私有线程。线程包含要执行的任务列表,并按顺序一次执行一个任务。每次偶数侦听器接收到新事件时,它都会创建一个新任务,并将其添加到专用线程中的任务列表中


编辑:Eugene建议使用一个线程池,如果你有大量的工作要做,而每个任务占用了相当多的时间,这对你来说可能是有益的。看看Java API中的线程池,如下所示:

事件侦听器在启动时创建并启动一个新的私有线程。线程包含要执行的任务列表,并按顺序一次执行一个任务。每次偶数侦听器接收到新事件时,它都会创建一个新任务,并将其添加到专用线程中的任务列表中


编辑:Eugene建议使用一个线程池,如果你有大量的工作要做,而每个任务占用了相当多的时间,这对你来说可能是有益的。看看Java API中的线程池,如下所示:

我会使用一个
ScheduledExecutorService
-将任务安排在一秒钟内执行,如果已经安排了任务,则取消它并将新任务安排在一秒钟内执行

这样,您的任务将在上次触发事件一秒钟后执行

private class Task implements Runnable {

    @Override
    public void run() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}
private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
private Future<?> scheduledTaskHandle;

private class Listener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        if (scheduledTaskHandle != null && !scheduledTaskHandle.isDone()) {
            scheduledTaskHandle.cancel(false);
        }
        scheduledTaskHandle = executorService.schedule(new Task(), 1, TimeUnit.SECONDS);
    }
}
私有类任务实现可运行{
@凌驾
公开募捐{
抛出新的UnsupportedOperationException(“尚未受支持”);//若要更改生成的方法体,请选择“工具”“模板”。
}
}
private final ScheduledExecutorService executorService=Executors.newSingleThreadScheduledExecutor();
私人未来计划表;
私有类侦听器实现ActionListener{
@凌驾
已执行的公共无效操作(操作事件e){
if(scheduledTaskHandle!=null&!scheduledTaskHandle.isDone()){
scheduledTaskHandle.cancel(false);
}
scheduledTaskHandle=executorService.schedule(新任务(),1,时间单位.SECONDS);
}
}
任务
是一个执行长时间运行操作的
可运行任务。
侦听器是您的侦听器类

Listener.actionPerformed
方法中,我们首先使用
Future
检查任务是否已安排,如果已安排,则取消该任务。我们不需要担心种族危险,因为如果任务在调用
isDone
和调用
cancel
之间完成,那么什么也不会发生

如果任务正在
侦听器
触发时运行,则该任务将完成,因为
取消
方法将使用
false
调用。另一个任务将被安排在启动侦听器后一秒钟或当前正在运行的任务完成后运行(因为我们只使用一个线程,不能运行多个任务)


然后,
侦听器将计划在1秒内执行任务的新执行。

我将使用
ScheduledExecutorService
-计划在1秒内执行任务,如果已计划任务,则取消该任务,并计划在1秒内执行新任务

这样,您的任务将在上次触发事件一秒钟后执行

private class Task implements Runnable {

    @Override
    public void run() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}
private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
private Future<?> scheduledTaskHandle;

private class Listener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        if (scheduledTaskHandle != null && !scheduledTaskHandle.isDone()) {
            scheduledTaskHandle.cancel(false);
        }
        scheduledTaskHandle = executorService.schedule(new Task(), 1, TimeUnit.SECONDS);
    }
}
私有类任务实现可运行{
@凌驾
公开募捐{
抛出新的UnsupportedOperationException(“尚未受支持”);//若要更改生成的方法体,请选择“工具”“模板”。
}
}
private final ScheduledExecutorService executorService=Executors.newSingleThreadScheduledExecutor();
私人未来计划表;
私有类侦听器实现ActionListener{
@凌驾
已执行的公共无效操作(操作事件e){
if(scheduledTaskHandle!=null&!scheduledTaskHandle.isDone()){
scheduledTaskHandle.cancel(false);
}
scheduledTaskHandle=executorService.schedule(新任务(),1,时间单位.SECONDS);
}
}
任务
是一个执行长时间运行操作的
可运行任务。
侦听器是您的侦听器类

Listener.actionPerformed
方法中,我们首先使用
Future
检查任务是否已安排,如果已安排,则取消该任务。我们不需要担心种族危险,因为如果任务在调用
isDone
和调用
cancel
之间完成,那么什么也不会发生

如果任务正在
侦听器
触发时运行,则该任务将完成,因为
取消
方法将使用
false
调用。另一个任务将被安排在启动侦听器后一秒钟或当前正在运行的任务完成后运行(因为我们只使用一个线程,不能运行多个任务)


监听器将在一秒钟内安排任务的新执行。

如果有1000个任务怎么办?我认为一个线程池将非常有用better@Eugene,这是一个公平的变化。我认为OP是计时任务执行(3秒),包括c