我试图使用以下代码在延迟后触发一个方法:
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) 我有一个代码必须在未来的某个日期时间执行,假设我有一个未来的日期,并且我想在未来的该日期 +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进行相同操作的优雅方法,以便拥有一个特定的池,因为该池将用于多个调用。有人可以帮助我吗?
我对龙卷风还很陌生。我无法理解使用run_on_executor和定义async方法之间的区别。是一样的吗?一个是多线程的,另一个不是?
先感谢您。
python asynchronous tornado python-3.x scheduledexecutorservice
最近我得到了一个面试问题:
有一种情况,一个线程在一小时的间隔内执行批处理操作,你会使用执行框架或普通线程,为什么?
我很迷惑 .
由于只有一个线程,因此不需要执行程序服务.我可以使用while
和sleep.
while(1)
{
// do task
// t1.sleep(60*60*1000);
}
Run Code Online (Sandbox Code Playgroud)
虽然有一个ScheduleExecutorService,它提供了许多方法来进行调度?
什么是最好的方法?
我使用单线程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) 代码 :
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
我已经看到了我的答案的一部分,但不是完整的。
我知道如果你想同时运行多个任务你想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) 这已经困扰了我几个小时。如果我安排一个任务在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) 我有以下代码.我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)
完整代码. …
我希望在延迟3秒后执行任务,而我的一项任务需要2秒才能完成。
我得到的输出显示5秒的间隔
注意:Student类实现了Callable接口, 我有以下查询
我得到的输出是
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)