Заполните JList с потоками

Я хочу, чтобы JList был заполнен несколькими потоками. Я пробовал таким образом, но Jlist пуст. Было бы хорошо, если бы jlist обновлялся на лету. Есть два потока, другой загружается в другом направлении.

            new Thread(new Runnable() {
            @Override
            public void run() {
                for(i=0; i<cells.size()/2; i++){
                    System.out.println("thread");

                    try{
                        HtmlPage p = client.getPage("https://tbilisi.embassytools.com/en/slotsReserve?slot="+cells.get(i).getAttribute("data-slotid"));
                        pages.add(p);
                        if(!p.getUrl().toString().contains("slotsReserve"))
                            model.add(i,p.getUrl().toString());
                    }
                    catch (Exception e){
                        e.printStackTrace();
                    }

                }
            }
        });
list1.setModel(model)

заранее спасибо

ОБНОВЛЕНИЕ * Так что я исправил с помощью SwingWorker

2 ответа

Swing является однопоточным фреймворком, то есть ожидается, что все обновления и модификации пользовательского интерфейса будут выполняться в контексте потока диспетчеризации событий.

Точно так же вы не должны делать в EDT ничего, что могло бы блокировать или иным образом мешать ему обрабатывать очередь событий (например, загружать контент из Интернета).

Это поднять загадку. Не удается обновить пользовательский интерфейс за пределами EDT, нужно использовать какой-то фоновый процесс для выполнения трудоемких / блокирующих задач...

Пока порядок предметов не важен, вы должны использовать несколько SwingWorkerна месте о Threadс, например...

DefaultListModel model = new DefaultListModel();

/*...*/

LoadWorker worker = new LoadWorker(model);
worker.execute();    

/*...*/

public class LoaderWorker extends SwingWorker<List<URL>, String> {

    private DefaultListModel model;

    public LoaderWorker(DefaultListModel model) {
        this.model = model;
    }

    protected void process(List<String> pages) {
        for (String page : pages) {
            model.add(page);
        }
    }

    protected List<URL> doInBackground() throws Exception {
        List<URL> urls = new ArrayList<URL>(25);
        for(i=0; i<cells.size()/2; i++){
            try{
                HtmlPage p = client.getPage("https://tbilisi.embassytools.com/en/slotsReserve?slot="+cells.get(i).getAttribute("data-slotid"));
                pages.add(p);
                if(!p.getUrl().toString().contains("slotsReserve")) {
                    publish(p.getUrl().toString());
                    urls.add(p.getUrl());
                }
            }
            catch (Exception e){
                e.printStackTrace();
            }        
        }
        return urls;
    }
} 

Это позволяет вам выполнить блокировку / длительный запуск в фоновом режиме (doInBackground) а также publish результаты этого метода, которые затем processЭд в контексте EDT...

См. Параллелизм в Swing для более подробной информации

Swing не является потокобезопасным, вы должны использовать SwingUtilities для запуска нескольких потоков, обновляющих Swing.

javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {
      doWhateverYouWant();
    }
});

прочитайте больше

Другие вопросы по тегам