【发布时间】:2017-10-30 00:05:40
【问题描述】:
我有一个定期执行代码的线程,例如。 G。每 10 秒。我希望可以选择以自发的方式调用相同的代码,而不必等待 10 秒。但是自动执行和自发执行的代码绝对不能同时运行,如果用户在线程调用相同方法时按下执行按钮,它们应该按顺序运行。
有没有人知道可以解决这种需求的好模式甚至是类?
首先想到的是使工作方法同步。但在这种情况下,手动执行(例如按下按钮)被阻止并且必须等到线程中的方法完成。有没有更好的方法不阻塞?
例子:
public class Executor extends Thread {
// endless loop, executes work method periodically with pause inbetween
@Override
public void run() {
while( true) {
work( "automatic");
pause(10000);
}
}
// Working method that's executed periodically or manually
private synchronized void work( String text) {
System.out.println( "Working " + text + " " + System.currentTimeMillis());
}
// helper method that pauses the thread
private static void pause( long sleepMs) {
try {
Thread.sleep(sleepMs);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// start automatic execution
Executor executor = new Executor();
executor.start();
// pause a while
pause(1000);
// manual execution
executor.work( "manual");
}
}
编辑:我的要求的解决方案:
public class ScheduledExecutor {
public static void main(String[] args) throws InterruptedException {
ScheduledThreadPoolExecutor executor = (ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(1);
executor.scheduleWithFixedDelay(new Work("auto"), 0, 10, TimeUnit.SECONDS);
Thread.sleep(1000);
executor.execute(new Work("manual"));
}
public static class Work implements Runnable {
String text;
public Work(String text) {
this.text = text;
}
@Override
public void run() {
System.out.println("Working " + text + " " + System.currentTimeMillis());
}
}
}
【问题讨论】:
-
中断睡眠?
-
如果线程在不处于睡眠模式时被中断会发生什么?
-
您能否更新您的问题以明确您希望它如何工作。您是说您不希望手动和自动的线程代码同时运行。然后你说你不希望手动执行在你按下按钮时被阻止......
-
强调Allan的一点:如果任务在定时器上运行,并且按下了按钮,你会1)中止正在运行的定时器启动的执行,并立即执行按钮启动的任务,或者 2) 完全跳过按钮启动的任务,或者 3) 阻塞,等待定时器启动的执行完成,然后运行按钮启动的任务?
-
完成。这是选项3,我。 e.等待线程完成,然后运行手动启动的任务。
标签: java multithreading