我有一种情况每分钟运行thread1和每小时运行thread2。我怎么能这样做。
目前我有一个工作代码可以在每分钟后运行thread1。
主要方法
static void main(string args[]){
orderListner thread1 = new orderListner();
thread1.start();
}
线程1
public static void orderListner extends thread{
public void run(){
while(true){
process();
thread.sleep(60000);
}
}
}
现在我需要为每小时后运行的结果启动新线程。我如何同时实现这一点(thread1将连续运行thread2应该每小时启动一次)
答案 0 :(得分:11)
我建议您使用ScheduledExecutorService
来集中这些任务。
public final class ScheduledExecutorServiceDemo {
private static final ScheduledExecutorService exec =
Executors.newScheduledThreadPool(2);
public static void main(String[] args){
// Schedule first task
exec.scheduleAtFixedRate(new Runnable(){
@Override
public void run() {
// do stuff
}}, 0, 1, TimeUnit.MINUTES);
// Schedule second task
exec.scheduleAtFixedRate(new Runnable(){
@Override
public void run() {
// do stuff
}}, 0, 1, TimeUnit.HOURS);
}
}
答案 1 :(得分:2)
你可以再做一次。我的意思是你创建一个代表你的第二个线程的新类(我们可以调用这个类SecondListener
)。它应该看起来像OrderListener
,但是睡眠时间应该改变为1小时。
然后你只需要修改你的main方法,这样就可以创建一个SecondListener类的对象,并启动线程,就像你使用OrderListener一样。
如果重要的是SecondListener在第一次运行之前没有运行它,直到一小时之后,你可以在SecondListener中的进程之前执行sleep。
最后关于睡眠时间的一个小建议:为了便于阅读,将它们表达为方程式。因此,而不是60000,键入1000 * 60.而不是3600000类型1000 * 60 * 60:)
答案 2 :(得分:1)
使用线程类的更好方法是创建一个实现Runnable而不是扩展线程的对象。如果您不想创建另一个文件,只需创建一个匿名类。 (尽可能避免使用继承,这是一个好习惯。)
话虽如此,只需创建一个在小时运行的新线程并启动它。我将使用你的线程方法。
static void main(string args[]){
orderListner thread1 = new orderListner();
orderListner2 thread2 = new orderListner2();
thread1.start;
thread2.start;
}
线程1是相同的,线程2是
public static void orderListner2 extends thread{
void run(){
while(true){
process();
thread.sleep(3600000);
}
}
}