2015-01-16 18 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