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??
ahuahauhaua boa
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;
}
}
}
}
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
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
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!
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();}
}
}
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: