标签: scheduledexecutorservice

ScheduledExecutorService无法正确触发

我试图使用以下代码在延迟后触发一个方法:

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(new UpdateTDDBRejections(), 5, 10, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

它应该等待延迟通过,触发"UpdateTDDBRejections"方法,该方法位于另一个Runnable类中,该方法将打印出一个短语然后再睡眠,然后再次打印短语等.

它不会这样做,它只是打印短语然后停止.

但是,当我这样设置时:

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(new Runnable() 
{
      @Override
      public void run() {
        // do stuff
           System.out.println("garbage garbage garbage");
      }
    }, 5, 10, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

它按预期的ScheduledExecutorService运行.我的印象是,由于我使用Java 8.4,我不必添加TimerTask来按照我想要的方式进行此坐标.有什么建议?或者我根本无法使用ScheduledExecutorService调用其他Runnable类?

编辑:这是UpdateTDDBRejections类.

public class UpdateTDDBRejections implements Runnable
{
   UpdateTDDBRejections()
   {
       System.out.println("garbage garbage garbage");
   }
   @Override
   public void run()
   {
   }
}
Run Code Online (Sandbox Code Playgroud)

java multithreading runnable scheduledexecutorservice

2
推荐指数
1
解决办法
929
查看次数

使用 ScheduledExecutorService 仅在特定日期时间运行代码一次

我有一个代码必须在未来的某个日期时间执行,假设我有一个未来的日期,并且我想在未来的该日期 +1 分钟内执行一段代码,但仅限一次。我知道我要使用 java Timer 和 TimerTask 来执行此操作。例如,执行以下操作:

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class Main {

    public static void main(String[] args) {

        Calendar myDate = Calendar.getInstance();
        myDate.add(Calendar.MINUTE, 1);
        Date afterOneMinute = myDate.getTime();
        System.out.println("Scheduled at:" + afterOneMinute);
        Timer timer = new Timer();

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("Executed at:" + (new Date()));

            }
        }, afterOneMinute);
    }

}
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种使用ScheduledExecutorService进行相同操作的优雅方法,以便拥有一个特定的池,因为该池将用于多个调用。有人可以帮助我吗?

java timertask scheduledexecutorservice

2
推荐指数
1
解决办法
4448
查看次数

在执行器中运行和定义异步方法之间的龙卷风差异

我对龙卷风还很陌生。我无法理解使用run_on_executor和定义async方法之间的区别。是一样的吗?一个是多线程的,另一个不是?

先感谢您。

python asynchronous tornado python-3.x scheduledexecutorservice

2
推荐指数
1
解决办法
860
查看次数

使用执行器框架还是普通线程?

最近我得到了一个面试问题:

有一种情况,一个线程在一小时的间隔内执行批处理操作,你会使用执行框架或普通线程,为什么?

我很迷惑 .

由于只有一个线程,因此不需要执行程序服务.我可以使用whilesleep.

while(1)
{
// do task
// t1.sleep(60*60*1000);
}
Run Code Online (Sandbox Code Playgroud)

虽然有一个ScheduleExecutorService,它提供了许多方法来进行调度?

什么是最好的方法?

java multithreading executors scheduledexecutorservice

1
推荐指数
1
解决办法
620
查看次数

从正在运行的任务中关闭 ExecutorService

我使用单线程ScheduledExecutorService来处理一些Runnable任务。当我的Runnable工作完成后,它会以ScheduledExecutorService可变的延迟重新安排自己。这种情况会无限期地发生,直到Runnable捕获到Exception

public class Runner { 

    ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();

    public void startWorking() { 
        // Single-shot start
        service.submit(new Task(service));
    }

    public void stopWorking() { 
        service.shutDown();
        // Do some other stuff
    }

    private static final class Task implements Runnable { 
        ScheduledExecutorService service;
        private Task(ScheduledExecutorService service) {
            this.service = service;
        }
        @Override 
        public void run() { 
            try { 
                // Do some work...
                service.schedule(this, variableDelay, TimeUnit.SECONDS);
            }
            catch(SomethingHappenedException e){ 
                // Shutdown service …
Run Code Online (Sandbox Code Playgroud)

java executorservice scheduledexecutorservice

1
推荐指数
1
解决办法
1996
查看次数

TextView setText 在 ScheduledExecutorService runOnUiThread 中不起作用

代码 :

private void startTimer() {
    final ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(1);
    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                public void run() {
                    int count = 60;
                    time.setText(count - 1 + "");
                    count--;
                }
            });
        }
    }, 0 , 1000, TimeUnit.MILLISECONDS);
}
Run Code Online (Sandbox Code Playgroud)

我想每 1 秒更新一次 TextView 中的文本,但这似乎只适用于第一次,以后的文本不会更新。

有人知道是什么问题吗??

android textview scheduledexecutorservice android-runonuithread

1
推荐指数
1
解决办法
820
查看次数

如何在java中重复运行多个任务并在一定时间后停止它

我已经看到了我的答案的一部分,但不是完整的。

我知道如果你想同时运行多个任务你想Thread使用Runnable实施

我发现ScheduledExecutorService如果您想运行这样的重复任务,您可以使用:

Runnable helloRunnable = () -> System.out.println("Hello world " + LocalDateTime.now().toLocalTime().toString());
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(helloRunnable, 0, 10, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

但这只运行一个线程,并且没有方法或参数在一段时间后杀死进程

我想做的是每 10 秒并行运行 5 次相同的任务,持续 10 分钟


编辑

如果未来的人们对这里的完整示例感兴趣,那就是:

public static void main(String[] args) {
    Runnable helloRunnable = () -> System.out.println("Hello world " + LocalDateTime.now().toLocalTime().toString());
    Runnable testRunnable = () -> System.out.println("Test runnable " + LocalDateTime.now().toLocalTime().toString());

    List<Runnable> taskList = new ArrayList<>();
    taskList.add(helloRunnable);
    taskList.add(testRunnable);

    ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

    List <ScheduledFuture<?>> promiseList = new ArrayList<>(); …
Run Code Online (Sandbox Code Playgroud)

java multithreading runnable scheduledexecutorservice

1
推荐指数
1
解决办法
1612
查看次数

取消在ScheduledExecutorService中计划的任务可使执行器保持活动状态

这已经困扰了我几个小时。如果我安排一个任务在5秒钟内执行,然后立即取消该任务,我希望“ awaitTermination”方法立即返回,但是在整个7秒钟内它将一直阻塞(不是五个)

这是一个在Java 11上重现该问题的JUnit 5测试用例。

package dummy;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.fail;

class DummyTest {

  @Test
  @DisplayName("Cancelling task should work...")
  void cancel_task() throws InterruptedException {
    ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();

    AtomicBoolean isExecuted = new AtomicBoolean(false);
    ScheduledFuture<?> scheduled = executorService.schedule(() -> isExecuted.set(true), 5, TimeUnit.SECONDS);
    scheduled.cancel(false);

    if (!executorService.awaitTermination(7, TimeUnit.SECONDS)) {
      fail("Didn't shut down within timeout"); // <-- Fails here
    }

    assertFalse(isExecuted.get(), "Task should be …
Run Code Online (Sandbox Code Playgroud)

java scheduledexecutorservice

1
推荐指数
1
解决办法
31
查看次数

Java:如何更新Runnable lambda中使用的变量?

我有以下代码.我ScheduledExecuterService在我的scheduleNumbers()方法中使用一个指定的毫秒数显示一系列随机数.但是,我似乎无法更新lambda curNumber中显示的内容,setNumber因为"从lambda表达式引用的局部变量必须是最终的或有效的最终"(非常有用).没有使用线程有没有办法解决这个问题?完整代码位于下面的pastebin链接中.

private void printNumbers(int[] randomNumbers) {
    int speed = DIFF_TIMES[difficulty.getSelectedIndex()];
    int amount = BASE_AMOUNT + currentScore;
    answerField.setEditable(false);
    scheduleNumbers(randomNumbers, speed, amount);
    currentNumberLab.setText("");
    answerField.setEditable(true);
}

public void scheduleNumbers(int[] randomNumbers, int speed, int amount) {
    int curNumber = 0;
    long initialDelay = 1000;
    final Runnable setNumber = () -> {
        currentNumberLab.setText(Integer.toString(randomNumbers[curNumber]));
        System.out.println("Set to " + randomNumbers[curNumber]);
    };
    final ScheduledFuture<?> setNumberHandle = scheduler.scheduleAtFixedRate(setNumber, initialDelay, speed, MILLISECONDS);
    scheduler.schedule(() -> {
        setNumberHandle.cancel(true);
    }, (speed*amount)+initialDelay, MILLISECONDS);
}
Run Code Online (Sandbox Code Playgroud)

完整代码. …

java lambda scheduledexecutorservice

0
推荐指数
1
解决办法
246
查看次数

在执行程序服务延迟后安排任务

我希望在延迟3秒后执行任务,而我的一项任务需要2秒才能完成。

我得到的输出显示5秒的间隔

注意:Student类实现了Callable接口, 我有以下查询

  1. 为什么会有5秒的延迟。如何才能使3秒的延迟为何在第二次执行中显示线程1,所以应该是线程2

我得到的输出是

The time is : Sat Nov 26 15:08:02 IST 2016

Doing a task during : prerna - Time - Sat Nov 26 15:08:06 IST 2016
pool-1-thread-1 Helloprerna
Doing a task during : abc - Time - Sat Nov 26 15:08:11 IST 2016
pool-1-thread-1 Helloabc
Doing a task during : def - Time - Sat Nov 26 15:08:16 IST 2016
pool-1-thread-2 Hellodef
Doing a task during : xyz - Time - Sat Nov 26 …
Run Code Online (Sandbox Code Playgroud)

java scheduledexecutorservice

0
推荐指数
1
解决办法
2665
查看次数