2015-01-16 3 views
0

У меня есть старое приложение с потоком робота, который выполняется каждый день. У меня есть источник для робота, но я не знаю, как это началось. И есть журнал, ведьма включает строку в базе данных, которая иногда включает в себя две идентичные строки, доказывая, что процесс выполняется в два раза.Thread Выполняется иногда удвоить

мы используем Windows Server 2003

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

мне нужно держать его от выполнения более чем один раз.

Я новичок в протекторы, не получить произведения нить право еще ...

спасибо всем заранее ...

ответ

0

Вы действительно не дают много информации, но вот несколько догадок:

  • Может ли весь процесс запускаться дважды?
  • Если поток работает дважды, показ функции запуска потока не поможет. Вам нужно будет найти код, который создает поток.
  • Запишите что-нибудь в блоке catch. Возможно, вызов сна сразу прерывается, и поэтому starter() вызывается дважды почти одновременно.
+0

Я думаю, что ответ намного проще, но я мог ошибаться, он никогда не упоминал, что «стартер()» вызывается дважды почти одновременно. Может быть, ему просто нужно увеличить количество времени сна? – 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

вы можете использовать ключевое слово java synchronized для метода run для блокировки метода из других потоков. 'public synchronized void run()' – Joe

 Смежные вопросы

  • Нет связанных вопросов^_^