与不同的睡眠时间同时运行两个线程
我有一种情况,每分钟运行一次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应该每小时启动一次)
更好的方式来使用线程类是使对象,实现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);
}
}
}
如果我错了,请纠正我。在main方法中我们定义了thread1.start;这意味着游标不会返回到此类,直到thread1终止,以启动thread2。 – gmeka
如果您注意到线程类中定义的方法名称以及调用启动线程类的方法,它们是不一样的。线程代码在名为'run'的方法中定义,而线程实际上是通过调用名为'start'的方法启动的。在'start'内部会调用各种黑魔法,这意味着'run'方法中的代码是从另一个代码运行__separately__,并且'start'方法几乎立即返回到main。之后,第二个线程以相同的向导方式启动;) – davogotland
睡眠线程并不是一个计划执行的好方法。更好的方法是使用定时器或调度程序 - 查看@ mre的答案。 –
我建议你使用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);
}
}
到目前为止做得很好! :)
你可以再次做同样的事情。我的意思是说,你创建了一个代表你的第二个线程的新类(我们可以称这个类为SecondListener
)。它应该看起来像OrderListener
,但睡眠时间应该改变为1小时。
然后您只需修改您的主要方法,以便它创建SecondListener类的一个对象,并像启动OrderListener一样启动线程。
如果SecondListener在第一次运行之前不运行第一次运行是很重要的,那么您可以在SecondListener的进程之前执行睡眠。
最后还有一个关于睡眠时间的小建议:为了可读性,将它们表达为方程式。因此,而不是60000,输入1000 * 60.而不是3600000类型1000 * 60 * 60 :)
为什么不使用两个定时器来代替? –
使用时间任务。看看这里http://download.oracle.com/javase/1.4.2/docs/api/java/util/TimerTask.html –
如果你可以每分钟做一次,你可以每隔一小时做一次。只要将睡眠时间乘以60.我错过了什么?请解释你想更明确地做些什么。 –