Como "matar" várias threads de uma vez?

Olá pessoal estou com a seguinte dúvida. Olhem o código abaixo:

[code]while(true){

		if ( contador < 100 ) {
			System.gc();	
			meteoro1 = new Circulo(obj.getGraphics(),Color.white);
			meteoro2 = new Circulo(obj.getGraphics(),Color.yellow);
			meteoro3 = new Circulo(obj.getGraphics(),Color.red);
			
			meteoro1.start();
			meteoro2.start();
			meteoro3.start();
			contador = contador + 3;
			System.out.println(contador);
		} else {
			System.gc();
			contador = 0;
		}
	
	}

[/code]

Como eu faço para eliminar essas 100 threads de uma vez, na minha ignorância tentei usar o System.gc(), porém não consegui liberar a memória. Como posso liberar a memória usada por essas threads??

Nota: Ignorem o while(true)

Elas vão morrer quando acabar a execução do método run()

Então não existe um meio de derrubá-las antes do fim do run() :?:

da um headshot nele hhehe brincadeira, po tu quer matar o processo c for false é isso ?

ops desculpa nao vi o “ignorem o while(true)”

ahuahauhaua boa :smiley:
Olhem o código inteiro, e rodem ele é bem bacana. Eu quero liberar memória num dado momento, pois estou executando um loop infinito. E queria saber se tem como fazer isso mesmo dentro desse loop.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.applet.*;
import java.util.Date;
import java.util.Random;

class Quadro extends JFrame {
	Quadro(String t) {
		super.setTitle(t);
	}
	
	public void paint (Graphics g) {
	}

}

class Circulo extends Thread implements Runnable {
	int x;
	int y;

	Graphics t;
	Color cor;

	Circulo(Graphics g,Color c) {
		t = g;
		y = 10;
		cor = c;
		sorteia();
	}

	void sorteia() {
		Date hoje = new Date ();	
		Random r =  new Random ();
		r.setSeed(hoje.getTime()*2);
		x = (Math.abs(r.nextInt () % 190));
	}
		     
	public void run() {
		int velocidade;
		Random r =  new Random ();
		Date hoje = new Date ();
		try {
			while(true) {
				r.setSeed(hoje.getSeconds()*6);
				velocidade = (Math.abs(r.nextInt () % 15));
				t.setColor(cor);
				//System.out.println("x="+x+" Y="+y );
				t.fillOval(x,y,10,10);
				sleep(100);
				t.setColor(Color.black);
				t.fillOval(x,y,10,10);
				y+=velocidade;

				if ( y > 400){ y = 40;sorteia();}
				}
				
		} catch(InterruptedException e){ e.getMessage();}
	}

}

public class Janela2 extends Applet {
	long contador=0;
	Circulo meteoro1;
	Circulo meteoro2;
	Circulo meteoro3;
	Quadro obj = new Quadro("Meteoros");

	public void init () {
		obj.show();
		obj.setSize(200,400);
		obj.setCursor(JFrame.HAND_CURSOR);
		obj.setBackground(Color.black);
		
		while(true){
			
			if ( contador < 100 ) {
				System.gc();	
				meteoro1 = new Circulo(obj.getGraphics(),Color.white);
				meteoro2 = new Circulo(obj.getGraphics(),Color.yellow);
				meteoro3 = new Circulo(obj.getGraphics(),Color.red);
				
				meteoro1.start();
				meteoro2.start();
				meteoro3.start();
				contador = contador + 3;
				System.out.println(contador);
			} else {
				System.gc();
				contador = 0;
			}
		
		}
	}
}

Tá ae :!:

tem como fzr sim mais nao lembro como c faz,e o material esta na minha casa qnd chegar vou dar uma olhada e te respondo c ainda nao tiver resolucionado,enquanto isso da uma olhada nesse site http://www.devmedia.com.br/articles/viewcomp.asp?comp=4459

Valew :smiley:

Se em vez de usar Threads diretamente você utilizar a classe ExecutorService do pacote java.util.concurrent você pode resolver isso facilmente. Além disso dá para usar um pool de threads, o que deixa bem mais leve. Bem tem várias vantagens em usar as classes deste pacote. Dá uma olhada em
http://java.sun.com/docs/books/tutorial/essential/concurrency/index.html

Espero ter ajudado.

Bem bacana o efeito!

Sobre o teu código.
Primeiro eu colocaria um

Thread.sleep(300);

No teu while(true) pra nao matar o teu processador, o valor ali tu pode variar…

Já as threads, tu pode limitar elas, em 100 como tu esta fazendo no teu código, mas dai tu não cria
mais e apenas desenha elas novamente em cima e deixa cair!

Assim tu não se preocupa com System.gc() :wink:

Fiz algumas alterações no código usar o um ThreadPoolExecutor, limitando o npumero de threads a 2000.

public class Janela2 extends Applet
{
	ThreadPoolExecutor executor;
	
	Quadro obj = new Quadro("Meteoros");

	public void init()
	{
		executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
		List<Future> circulosExecutando = new ArrayList<Future>();
		obj.setVisible(true);
		obj.setSize(200, 400);
		obj.getContentPane().setCursor(new Cursor(Cursor.HAND_CURSOR));
		obj.setBackground(Color.black);

		while (circulosExecutando.size() < 2000) {
			circulosExecutando.add(executor.submit(new Circulo(obj.getGraphics(), Color.white)));
			circulosExecutando.add(executor.submit(new Circulo(obj.getGraphics(), Color.yellow)));
			circulosExecutando.add(executor.submit(new Circulo(obj.getGraphics(), Color.red)));
		}

	}
}
public class Circulo implements Runnable {  
     int x;  
     int y;  
   
     Graphics t;  
     Color cor;  
   
     public Circulo(Graphics g,Color c) {  
         t = g;  
         y = 10;  
         cor = c;  
         sorteia();  
     }  
   
     void sorteia() {  
         Date hoje = new Date ();      
         Random r =  new Random ();  
         r.setSeed(hoje.getTime()*2);  
         x = (Math.abs(r.nextInt () % 190));  
     }  
                
     public void run() {  
         int velocidade;  
         Random r =  new Random ();  
         Date hoje = new Date ();  
         try {  
             while(true) {  
                 r.setSeed(hoje.getSeconds()*6);  
                 velocidade = (Math.abs(r.nextInt () % 15));  
                 t.setColor(cor);  
                 //System.out.println("x="+x+" Y="+y );  
                 t.fillOval(x,y,10,10);  
                 Thread.sleep(100);  
                 t.setColor(Color.black);  
                 t.fillOval(x,y,10,10);  
                 y+=velocidade;  
   
                 if ( y > 400){ y = 40;sorteia();}  
                 }  
                   
         } catch(InterruptedException e){ e.getMessage();}  
     }  
   
 }

Use um MutableBoolean, e ponha o mutableboolean.get() na condição do while. Pra acabar, mutableboolean.set(true) deve resolver.

Pelo que eu me lembre usar um ThreadGroup seria mais simples… ai voce para o grupo…

:smiley: Valeu pessoal :!: :!:

Vou estudar todos os casos, pois não domino muito bem esse tipo de programação.
Abraços e até++

[quote=andreymb]Fiz algumas alterações no código usar o um ThreadPoolExecutor, limitando o npumero de threads a 2000.

[/quote]

Eu não consegui compilar seu código. O compilador retorna a seguinte mensagem:

‘(’ or ‘[’ expected; e acusa new ArrayList ^ ();

Por que será?

O ThreadGroup já parou de ser recomendado faz tempo. Em todo caso, aqui nesse link tem um exemplo de como usa-lo para parar várias threads:
http://www.guj.com.br/posts/list/52481.java#276164

Dá uma lida na discussão toda do tópico, que tem tema e a dúvida exatamente igual a sua…

[quote=sene]Eu não consegui compilar seu código. O compilador retorna a seguinte mensagem:

‘(’ or ‘[’ expected; e acusa new ArrayList ^ ();

Por que será?[/quote]

Verifique se você está rodando com Java 5 ou superior. Pelo visto, seu IDE acha que é Java 4 ou inferior.

[quote=ViniGodoy][quote=ffranceschi]
Dá uma lida na discussão toda do tópico, que tem tema e a dúvida exatamente igual a sua…[/quote]

O velho problema de ir só criando um tópico… :oops:

Foi mal :?

Ops… nem era uma crítica… embora relendo pareceu. Eu só ressaltei pra vc ter certeza de que o tópico podia te ajudar, já que se tratava da mesma coisa. hehehehe

É que muita gente não clica nos links que a gente passa…

Sem problemas, eu entendo isso. Já faz um tempo que participo de foruns e sei que é importante a organização e a não fragmentação do conhecimento e também sou contra ficar criando tópicos sem pesquisar direito. Mas, às vezes escapa :roll:

Abraço 8)

[quote=ViniGodoy]
Verifique se você está rodando com Java 5 ou superior. Pelo visto, seu IDE acha que é Java 4 ou inferior.[/quote]

=D
Boa garoto, meu path tava indicando para uma versão 1.4 que também tenho instalado.