Я новичок в Java, и я не работал с потоками в прошлом. Теперь у меня есть очень сложная проблема для моего уровня знаний.Синхронизация двух таймеров с несколькими экземплярами (Java)
Я разработал две функции «Отправить почту» и «Проверить почту». Каждый пользователь зарегистрировать свои предпочтения и система создает два каталога с большим количеством инструкций для периодической работы как
A) отправить сообщение каждый 1500 мс
B) отправить сообщение каждые 1800 мс
C) отправить сообщение каждые 3000 мс
И А) проверка сообщение каждые 2000 мс
B) проверка сообщения каждые 6000 мс
C) проверить сообщение каждые 8000 мсек
Я пробовал много способов с потоками, но я не могу это сделать. Мой вопрос - это лучший способ их синхронизации? Ниже приведен код моего последнего усилия с использованием потоков.
public class MailCreatorThread extends Thread {
@Override
public void run() {
CreateMail(_date); //creates a mail with _date as subject
}
}
public class GPSThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
while (!_isTimeToStop) {
try {
while (_servicesToUpdate.size() == 0) {
Thread.sleep(500);
}
_currentService = (MyService) _servicesToUpdate.get(0)
.clone();
_servicesToUpdate.remove(0);
MailCreatorThread mailCreatorThread = new MailCreatorThread();
mailCreatorThread.start();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class CheckServicesThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
while (!_isTimeToStop) {
try {
Thread.sleep(1000);
for (int j = 0; j < _servicesList.length; j++) {
MyService currentService = ((MyService) _servicesList[j]);
if (myService.getTimeToNextUpdate() - 1000 <= 0) {
_servicesToUpdate
.add((MyService) currentService
.clone());
currentService
.setTimeToNextUpdate(currentService
.getUpdatePeriod());
} else {
currentService
.setTimeToNextUpdate(currentService
.getTimeToNextUpdate() - 1000);
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
stopSelf();
}
}
Спасибо! Я пробовал ваше решение, и оно отлично работает! – Bilias7