2013-09-26 54 views
1

我希望JList被填充多個線程。 我試過這種方式,但jlist是空的。 如果JList的是提前更新的飛行 有兩個線程,另外一個載荷anouther方向使用線程填充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) 

由於這將是很好

UPDATE* 所以我固定用的SwingWorker

+0

你不'開始()'你的線程。你不應該那樣做,因爲Swing不是線程安全的。閱讀關於「SwingWorker」 –

回答

0

Swing是not thread safe應該使用SwingUtilities運行多線程更新擺動。

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

read more

1

Swing是單線程架構,也就是說,它預計到UI的所有更新和修改,從事件指派線程的上下文中完成的。

同樣,你應該做的EDT任何可能阻止或防止它處理事件隊列(如從網上下載內容)。

這提出一個難題。無法更新EDT之外的UI,需要使用某種後臺進程執行耗時/阻塞任務...

只要項目順序不重要,就可以使用多個SwingWorker s就緒在Thread S的O,例如...

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 ED的範疇內運行結果EDT ...

小號ee值Concurrency in Swing更多細節