[英]Automating method execution in java
我有6个函数需要在特定的时间间隔内运行:
public void runFirst() {
System.out.println("First method");
}
public void runSecond() {
System.out.println("Second method");
}
public void runThird() {
System.out.println("Third method");
}
public void runFourth() {
System.out.println("Fourth method");
}
public void runFifth() {
System.out.println("Fifth method");
}
public void runSixth() {
System.out.println("Sixth method");
}
我需要在单击按钮后立即运行“第一个”,第二个必须在65秒之后,第二个必须在第二个之后20秒,第四个在第三个之后15秒,依此类推,在我使用Thread.sleep
但是我将需要不眠不休。
最好的方法是什么,有人可以根据我的方法向我展示一些示例。
您可以使用Quartz。 单击按钮时,您可以获得系统当前时间,并添加新的计划作业以在特定日期和时间运行。 因此,Quartz会按时运行它。
另一种方法是创建一个新线程并在其上定义睡眠时间段,然后让其运行功能。
你为什么不能使用
Thread.sleep
并在不同的线程中运行此代码(然后,整个应用不会在睡眠中停止)
要在一段时间后运行任务,您应该使用Timer ,这是“线程安排任务以安排将来在后台线程中执行的工具” 。
它使您不必创建自己的线程:更少出错,更容易。 它可以管理多个计划任务。 但是请注意,这些任务应该是短暂的(其他任务将阻塞计时器用于调度目的的线程)。
使用ExecutorService
。 基本想法是这样的:
// "Global" resource
final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5); // Adjust threadpool size
...
// inside onclick() processing
ScheduledFuture<Void> future1 = executorService.schedule(new Callable<Void>() {
@Override Void call() {
try {
runFirst();
} finally {
scheduleFuture2();
}
}
},
65,
TimeUnit.SECONDS);
...
void scheduleFuture2() {
ScheduledFuture<Void> future2 = executorService.schedule(new Callable<Void>() {
@Override Void call() {
try {
runSecond();
} finally {
scheduleFuture3();
}
}
},
20,
TimeUnit.SECONDS);
}
...
void scheduleFuture3() {
ScheduledFuture<Void> future3 = executorService.schedule(new Callable<Void>() {
@Override Void call() {
try {
runThird();
} finally {
scheduleFuture4();
}
}
},
15,
TimeUnit.SECONDS);
}
...
// And so on
一些注意事项:
runFirst()
, runSecond()
,...执行Swing / AWT UI操作,则应在这些方法内正确使用SwingUtilities.invokeLater executorService.shutdown()
。 如果忘记了,您将“泄漏”线程。 Void
的引用(大写的“ V”)是有意的:我们使用的是Void
类,而不是void
类型 {
ScheduledExecutorService worker = Executors.newScheduledThreadPool(1);
worker.execute(() -> runFirst());
worker.schedule(() -> runSecond(), 65, TimeUnit.SECONDS);
worker.schedule(() -> runThird(), 85, TimeUnit.SECONDS);
worker.schedule(() -> runFourth(), 100, TimeUnit.SECONDS);
worker.schedule(() -> runFifth(), 110, TimeUnit.SECONDS);
worker.schedule(() -> runSixth(), 115, TimeUnit.SECONDS);
worker.shutdown();
}
如果由于某种原因不能使用Java 8,请使用Runnable的 匿名实现而不是Lambda表达式 :
// worker.schedule(() -> runSixth(), 115, TimeUnit.SECONDS);
worker.schedule(new Runnable(){
@Override
public void run() {
runSixth();
}}, 115, TimeUnit.SECONDS);
为您的方法创建一个Thread类和另一个Class
现在:
public class ThreadTest implements Runnable {
private int functionNumber;
private int time2start;
private YourClass obj;
public ThreadTest(int functionNumber, int time2start, YourClass obj) {
this.functionNumber = functionNumber;
this.time2start = time2start;
this.obj = obj;
}
public void run() {
try {
Thread.currentThread().sleep(time2start);
} catch (Exception ex) {
}//Time Delay before executing methods
switch (functionNumber) {
case 1:
obj.runFirst();
break;
case 2:
obj.runSecond();
break;
case 3:
obj.runThird();
break;
case 4:
obj.runFourth();
break;
//keep adding
}
}
}
然后为您的方法类:
public class YourClass {
public void runFirst() {
System.out.println("First method");
}
public void runSecond() {
System.out.println("Second method");
}
public void runThird() {
System.out.println("Third method");
}
public void runFourth() {
System.out.println("Fourth method");
}
public void runFifth() {
System.out.println("Fifth method");
}
public void runSixth() {
System.out.println("Sixth method");
}
}
现在,这是按钮的onClick事件的方法:
//on button click
ThreadTest th1 = new ThreadTest(1, 0, obj);//here obj is YourClass
ThreadTest th2 = new ThreadTest(2, 65000, obj);//65 SECONDS
//... keep adding
Thread thread1 = new Thread(th1);
Thread thread2 = new Thread(th2);
//...keep adding
thread1.start();
thread2.start();
//...keep adding
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.