Я реализую проект, который берется за то, чтобы читать котировки событий в различных webs. Для каждого Веба я верю в класс, который берется за то, чтобы читать данные об этом Вебе и получает в наследство класса отец.
Я хочу, чтобы все классы, полученные в наследство от этого класса отец имели статическое поле, которое содержало бы календарь событий. Этот календарь событий я хочу, чтобы стала отвечающей совремнным требованиям каждая минута посредством thread, и здесь он, где я появляются сомнения.
Этот thread может быть создан первым классом дочь instanciada, позволяя, чтобы он обновил статическую переменную списка событий? чтобы делать нечто похожее это отец был бы должен признавать этим thread как статическое поле в классе для того, чтобы только instancie если в instanciar первый класс дочь?
Идея была бы структурой, сходной с этой:
public abstract class GenericCrawler extends Thread {
public static CalendarThread calThread;
public static List<Eventos> eventosCalendario;
}
public class CrawlerA extends GenericCrawler {
//itera con la lista eventosCalendario un bucle que se repite de forma perpetua para actualizar los precios en todo momento
}
public class CrawlerB extends GenericCrawler {
//itera con la lista eventosCalendario un bucle que se repite de forma perpetua para actualizar los precios en todo momento
}
public class CalendarThread extends Thread{
//Crea la lista de eventos y los actualiza cada minuto añadiendo o eliminando eventos
}
Мне кажется, что самая большая проблема, которая у тебя будет, - со списком событий и конкурирующим доступом календаря, который обновляет события и crawlers, которые он конечно она должен пробегать, чтобы извлекать informaciГіn. Способ противостоять эту точку - синхронизируя доступ к списку. Другая podrГ, - чтобы состоять в том, чтобы использовать CopyOnWriteArrayList
, который является одной versiГіn ArrayList
, которые это Thread safe.
MirГЎndo система, что querГ©s вооружать с uan перспективу mГЎs широкая мне кажется, что не necesitГЎs mГ©todos даже не признаки estГЎticos.
podrГ, - чтобы вооружать, таким образом:
public class App{
private Calendario calendario;
private CrawlerA crawlerA;
private CrawlerB crawlerB;
public static void main(String [] args){
App app = new App();
app.start();
}
public void start(){
Calendario calendario = new Calendario();
Thread threadCalendario = new Thread(calendario);
thredCalendario.start();
CrawlerA crawlerA = new CrawlerA(calendario);
CrawlerB crawlerB = new CrawlerB(calendario);
Thread tca = new Thread(crawlerA).start();
Thread tcb = new Thread(crawlerB).start();
}
}
Потом календарь обновляет Ваши события и снабжает или они mГ©todos, чтобы вручать informaciГіn crawlers.
Доступ к списку синхронным ввиду того, что она actualizaciГіn он может падать, когда thread crawler estГЎ выполняя getXdeEvento () asГ - что мы заставляем ждать одного или в другой thread.
X заканчивает тем, что является любой вещью, в которой crawler нуждался бы списка.
И mГ©todo getXdeEvento (), он называется на календаре, и возвращает этот X.
private class Calendario implements Runnable{
private static final long MILLIS_ENTRE_ACTUALIZACION = 60 * 1000; // 1 minuto
private boolean end = false;
private List<Eventos> eventos = new ArrayList<>();
public void run(){
while(!end){
sychronized(eventos){
//Actualizar eventos
}
try{
Thread.sleep(MILLIS_ENTRE_ACTUALIZACION);
}catch(InterruptedException e){
//Manejar la excepción.
}
}
}
// Método para buscar infomración X en el calendario
public X getXdeEvento(int idEvento){
X rtn = null;
synchronized(eventos){
for(Evento evento : eventos){
if(evento.getId() == idEvento){
rtn.setInfoDelEvento(evento.getInfoDelEvento());
}
}
}
return rtn;
}
public void stop(){
this.end = true;
}
}
год И crawlers (В и B serГ-an будь равен в этом уровне abstracciГіn, asГ - который я помещаю cГіdigo, что идет на два).
crawlers скроллируют loop, где они ищут что-то из календаря, делают что-то с этим, и потом спят немного.
public class CrawlerA implements Runnable{
private static final long MILLIS_ENTRE_ACTUALIZACION = 2 * 60 * 1000; // 2 minutos
Calendar calendario;
private boolean end = false;
public CrawlerA(Calendario calendario){
this.calendario = calendario;
}
public void run(){
while(!end){
X xDeEvento = calendario.getXdeEvento();
// Hacer algo con X
try{
Thread.sleep(MILLIS_ENTRE_ACTUALIZACION);
}catch(InterruptedException e){
//Manejar la excepción.
}
}
}
public void stop(){
this.end = true;
}
}
Внутри архитектуры, которую ты выставляешь, я появляется сомнение.
В классах Crawler внутри Вашего вечного цикла должны звонить в mГ©todos самого Crawler, который нуждается в том, чтобы иметь список событий на котором повторять, и что позже actualizarГЎ данные о событии, если он состоит в том, что он не был удален классом Calendar. Чтобы избегать проблемы скопления, повторив habГ - в подумавший того, чтобы у класса Crawler было частное поле, занеси в список Событий, которые обновляли бы звоня в класс Calendar каждый iteraciГіn цикла и которые он однажды делал бы соответствующие операции с каждым событием, вновь призовите в класс Calendar обновлять данные о событии
public class CrawlerA implements Runnable{
private static final long MILLIS_ENTRE_ACTUALIZACION = 2 * 60 * 1000; // 2 minutos
Calendar calendario;
private List<Evento> listaPrivadaEventos;
private boolean end = false;
public CrawlerA(Calendario calendario){
this.calendario = calendario;
}
public void run(){
while(!end){
listaPrivadaEventos = calendario.getListaEventos();
/*llama a métodos de este crawler que iteran sobre listaPrivadaEventos
actualizan datos de cada evento contenido en esa listaPrivadaEventos
envia esa listaPrivadaEventos a calendario para que este modifique los
de la lista original*/
calendario.actualizarDatosListaEventos(listaPrivadaEventos);
try{
Thread.sleep(MILLIS_ENTRE_ACTUALIZACION);
}catch(InterruptedException e){
//Manejar la excepción.
}
}
}
public void stop(){
this.end = true;
}
}