2015-01-16 22 views
0

我有一个旧的应用程序,每天都有一个机器人线程执行。我有机器人的来源,但我不知道这个步伐是如何开始的。还有一个日志,女巫在数据库中包含一行,有时包含两行相同的行,证明该过程正在执行两次。线程执行有时加倍

我们使用Windows Server 2003

public void run() 
{ 
while (true) 
{ 
    starter(); 
    try { 
    Thread.sleep(10800000L); 
    } 
    catch (InterruptedException localInterruptedException) 
    { 
    } 
} 
} 

我需要保持它从执行不止一次。

我是新来的胎面,没有真正得到一个线程的作品权尚未...

谢谢大家提前...

回答

0

你并不真的提供了很多的信息,但这里有一些猜测:

  • 整个过程是否可以启动两次?
  • 如果线程运行两次,显示线程运行功能将无济于事。你必须找到创建线程的代码。
  • 在catch块中记录一些东西。也许睡眠呼叫会立即中断,这就是为什么starter()几乎在同一时间被调用两次。
+0

我认为答案比这更容易,但我可能是错的,他从来没有提到'starter()'几乎同时被调用两次。难道他只需要增加睡眠时间? – Iootu

+0

我无法找到启动过程的代码。这就是为什么我无法纠正这个问题。我不知道它是否直接从apache或服务器执行。我们没有任何有关这方面的文件,也没有任何人实施该软件仍然在公司工作。 –

+1

@CarlosJunior不应该有可能在包含此代码的类的所有用途中搜索代码库?这不能产生许多结果,可以吗? –

0
public void run() 
{ 
     int delay = 86400000; //milliseconds 
     ActionListener taskPerformer = new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
       starter(); 
      } 
     }; 
     new Timer(delay, taskPerformer).start(); 
} 

或者......

import java.util.Date; 
import java.util.Timer; 
import java.util.TimerTask; 

public class DailyTask extends TimerTask { 

    @Override 
    public void run() { 
     //Or if you use a logger like log4j you can insert logger code here. 
     System.out.println("Start:" + new Date()); 
     starter(); 
     System.out.println("End:" + new Date()); 
    } 

    public static void main(String args[]) { 

     TimerTask tt= new DailyTask(); 
     // running timer task as daemon thread 
     Timer t = new Timer(true); 
     t.scheduleAtFixedRate(tt, 0, 86400000); 
     System.out.println("DailyTask started:" + new Date()); 
    } 

} 

这应该运行起动器()每24小时一次。

+0

另一种选择是使用类似[Quartz Scheduler](http://quartz-scheduler.org/documentation/quartz-2.2.x/quick-start)的东西来进行研究,但它可能需要更多的工作来设置,但可能更多可靠。 – Joe

+0

有一种方法可以防止它运行多个姿态?比如使用一个标志或其他东西(例如AtomicBoolean)。 –

+0

您可以使用run方法上的java synchronized关键字来锁定来自其他线程的方法。 'public synchronized void run()' – Joe