Иметь из-за полученных в наследство классов thread, что обновляет статическую переменную класса отец

Я реализую проект, который берется за то, чтобы читать котировки событий в различных 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
}
0
задан 19.03.2019, 00:41
2 ответа

Мне кажется, что самая большая проблема, которая у тебя будет, - со списком событий и конкурирующим доступом календаря, который обновляет события и 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;
    }
}
1
ответ дан 02.12.2019, 05:29
  • 1
    Внутри этой архитектуры, ¿ serí в возможный añ adir в класс App поле CopyOnWriteArrayList событий? Поле, что serí в обновленный относительно существующих событий из-за класса Календарь (añ ade и удали события) и как только другие базы данных, которые содержит класс События actualizarí за классами Crawler, с чем tambié n crearí в поле CopyOnWriteArrayList событий относительно списка событий, которое создает класс Календарь. – Jorge 19.03.2019, 15:23
  • 2
    Поскольку ты комментируешь, мне кажется, что он не будет подавать тебе CopyOnWriteArrayList. Эта женила прощение долга кредитором тема синхронизирования доступа к arraylist (оплачивая цену выступления), но он не будет служить тебе для actualizació n данных о событиях со стороны различных crawlers. В моем ответе есть метод, чтобы получать информацию X из событий. Того же способа обрежь делать mé все, что crawlers призвали на календаре изменять данные о событиях (всегда синхронизируя доступ к списку). – Juan 19.03.2019, 16:21

Внутри архитектуры, которую ты выставляешь, я появляется сомнение.

В классах 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;
    }
}
0
ответ дан 02.12.2019, 05:29