<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Últimas mensagens do tópico "Número máximo de SwingWorker threads"]]></title>
		<link>http://www.portaljava.com/forum/posts/list/1.page</link>
		<description><![CDATA[Últimas mensagens enviadas no tópico "Número máximo de SwingWorker threads"]]></description>
		<generator>JForum - http://www.jforum.net</generator>
			<item>
				<title>Número máximo de SwingWorker threads</title>
				<description><![CDATA[ Olá pessoal,<br /> <br /> alguém aí sabe qual o número máximo de SwingWorker threads que pode ser disparado? Fiz uma pequena aplicação para testar. Coloquei 20 JLabels (label1, label2, ..., label20)e um botão que dispara uma SwingWorker thread para cada label. O método [code]doInBackground()[/code] da minha classe derivada da SwingWorker vai alterando o label. Para isso utilizei os métodos [code]publish[/code] e [code]process[/code].<br /> O que acontece é o seguinte o botão dispara as threads para os 10 primeiros labels. As outras threads parecem ficar em uma fila e só começam a executar na medida que as outras vão terminando. O problema é que eu preciso que os 20 labels sejam alterados simultaneamente e não apenas 10 de cada vez.<br /> Alguém sabe uma solução para isso?<br /> <br /> Minha classe:<br /> <br /> [code]<br /> public class MeaningOfLifeFinder extends SwingWorker&lt;String, Integer&gt; {<br />     private int id;<br />     private JLabel label;<br />     private Random r;<br />     <br />     MeaningOfLifeFinder(int i, JLabel mylabel) {<br />         long seed;<br />         id = i;<br />         label = mylabel;<br /> <br />         // Apenas inicializando o seed do random com valores chutados.<br />         if (i%2 == 0) {<br />             seed = (1433*i)+(32425/i)-(64214+(i*2));<br />         } else {<br />             seed = (2463/i)*i - (23*i);<br />         }<br />         r = new Random(seed);<br />     }<br /> <br />     @Override<br />     public String doInBackground() throws InterruptedException {<br />         return findTheMeaningOfLife();<br />     }<br />     <br />     @Override<br />     protected void done() {<br />         try { <br />             label.setText(get()+id);<br />         } catch (Exception ignore) {<br />         }<br />     }<br />     <br />     String findTheMeaningOfLife() throws InterruptedException {<br />         Integer i;<br />                 <br />         for (i = 0; i &lt; 10; i++) {<br />             publish(i);  // Este valor vai para o label associado.<br />             Thread.sleep(r.nextInt(5000));<br />         }<br />         <br />         return "I found it! ";<br />     }<br /> <br />     <br />     // Isto sera executado na EDT Event Dispatch Thread<br />     @Override<br />     protected void process(List&lt;Integer&gt; list) {<br />         for(Integer k: list) {<br />             if (isCancelled()) {<br />                 break;<br />             }<br />             label.setText(k.toString());<br />         }<br />     }<br /> <br /> }<br /> [/code]<br /> <br /> E o código que dispara as threads:<br /> <br /> [code]<br /> private void buttonActionPerformed(java.awt.event.ActionEvent evt) {                                       <br /> // TODO add your handling code here:<br />     (new MeaningOfLifeFinder(1, label1)).execute();<br />     (new MeaningOfLifeFinder(2, label2)).execute();<br />     (new MeaningOfLifeFinder(3, label3)).execute();<br />     (new MeaningOfLifeFinder(4, label4)).execute();<br />     (new MeaningOfLifeFinder(5, label5)).execute();<br />     (new MeaningOfLifeFinder(6, label6)).execute();<br />     (new MeaningOfLifeFinder(7, label7)).execute();<br />     (new MeaningOfLifeFinder(8, label8)).execute();<br />     (new MeaningOfLifeFinder(9, label9)).execute();<br />     (new MeaningOfLifeFinder(10, label10)).execute();<br />     (new MeaningOfLifeFinder(11, label11)).execute();<br />     (new MeaningOfLifeFinder(12, label12)).execute();<br />     (new MeaningOfLifeFinder(13, label13)).execute();<br />     (new MeaningOfLifeFinder(14, label14)).execute();<br />     (new MeaningOfLifeFinder(15, label15)).execute();<br />     (new MeaningOfLifeFinder(16, label16)).execute();<br />     (new MeaningOfLifeFinder(17, label17)).execute();<br />     (new MeaningOfLifeFinder(18, label18)).execute();<br />     (new MeaningOfLifeFinder(19, label19)).execute();<br />     (new MeaningOfLifeFinder(20, label20)).execute();<br />     <br /> }[/code]]]></description>
				<guid isPermaLink="true">http://www.portaljava.com/forum/posts/preList/44614/164322.page</guid>
				<link>http://www.portaljava.com/forum/posts/preList/44614/164322.page</link>
				<pubDate><![CDATA[Fri, 4 Jul 2008 12:25:42]]> GMT</pubDate>
				<author><![CDATA[ carloshiga]]></author>
			</item>
			<item>
				<title>Número máximo de SwingWorker threads</title>
				<description><![CDATA[ [quote=carloshiga]O problema é que eu preciso que os 20 labels sejam alterados simultaneamente e não apenas 10 de cada vez.<br /> Alguém sabe uma solução para isso?[/quote]<br /> <br /> Mesmo usando Thread a atualização vai ser sequencial!  <img src="http://www.portaljava.com/forum//images/smilies/4b630f0bfb91d1261837a94321aaa9b0.gif" border="0"> <br /> <br /> No swing, tudo vai ser atualizado em uma thread, a EventDispatchThread, de modo sequencial]]></description>
				<guid isPermaLink="true">http://www.portaljava.com/forum/posts/preList/44614/164326.page</guid>
				<link>http://www.portaljava.com/forum/posts/preList/44614/164326.page</link>
				<pubDate><![CDATA[Fri, 4 Jul 2008 15:16:03]]> GMT</pubDate>
				<author><![CDATA[ fabiofalci]]></author>
			</item>
			<item>
				<title>Re:Número máximo de SwingWorker threads</title>
				<description><![CDATA[ Resolvido:<br /> <br /> [code]<br /> // Passar o número máximo de threads a serem execultadas simultaneamente<br /> ExecutorService threadPool = Executors.newFixedThreadPool(20);<br /> <br /> threadPool.submit(new MeaningOfLifeFinder(label1));<br /> threadPool.submit(new MeaningOfLifeFinder(label2));<br /> threadPool.submit(new MeaningOfLifeFinder(label3));<br /> // ... e assim por diante.<br /> [/code]]]></description>
				<guid isPermaLink="true">http://www.portaljava.com/forum/posts/preList/44614/164331.page</guid>
				<link>http://www.portaljava.com/forum/posts/preList/44614/164331.page</link>
				<pubDate><![CDATA[Fri, 4 Jul 2008 23:47:21]]> GMT</pubDate>
				<author><![CDATA[ carloshiga]]></author>
			</item>
	</channel>
</rss>