1

JList に複数のスレッドを設定したい。この方法を試しましたが、jlist は空です。jlist がオンザフライで更新されるとよいでしょう 2 つのスレッドがあり、もう 1 つは別の方向にロードされます

            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 を使用して修正しました

4

2 に答える 2

1

Swing は単一スレッドのフレームワークです。つまり、UI に対するすべての更新と変更は、イベント ディスパッチ スレッドのコンテキスト内から行われることが期待されます。

同様に、EDT では、イベント キューの処理をブロックしたり妨げたりするようなことは何もしないでください (Web からのコンテンツのダウンロードなど)。

これは難問を提起します。EDT の外で UI を更新できません。何らかのバックグラウンド プロセスを使用して、時間のかかるタスクやブロックしているタスクを実行する必要があります...

項目の順序が重要ではない限り、複数SwingWorkerの を使用して の代わりに o を使用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このメソッドの結果をprocessEDT のコンテキスト内で実行できます...

詳細については、Swingの同時実行を参照してください。

于 2013-09-26T21:32:07.143 に答える
0

Swing はスレッド セーフではないため、SwingUtilities を使用して複数のスレッドで Swing を更新する必要があります。

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

続きを読む

于 2013-09-26T21:16:52.973 に答える