我有一个定期执行代码的线程, 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());
}
}
}
中断睡眠? –
如果线程在非休眠模式下被中断会发生什么? – Roland
您是否可以更新您的问题以清楚说明您希望如何工作。你说你不希望手动和自动的线程代码同时运行。然后你说你不想在按下按钮时手动执行被阻止...... – Allan