填充JList的使用线程(Populate JList with threads)

2019-10-18 16:55发布

我想JList的与多线程进行填充。 我想这样,但是JList中是空的。 如果JList的更新是在飞行中有两个线程,另外一个载荷anouther方向这将是很好

            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)

提前致谢

UPDATE *所以我固定用的SwingWorker

Answer 1:

Swing是单线程架构,也就是说,它预计到UI的所有更新和修改,从事件指派线程的上下文中完成的。

同样,你应该做的EDT任何可能阻止或防止它处理事件队列(如从网上下载内容)。

这提高了一个难题。 无法更新EDT以外的UI,需要使用某种类型的后台进程的执行耗时/阻塞的任务...

只要项目的顺序是不重要的,你会使用多个SwingWorker到位S 0的的Thread S,例如...

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了解更多详情



Answer 2:

Swing是不是线程安全的 ,你应该使用SwingUtilities的运行多个线程更新摆动。

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

阅读更多



文章来源: Populate JList with threads