Controle de Threads

4 respostas
J

Como poderia fazer um controle de thread?

Por exemplo, quero criar 100 threads e cada uma recebe um objeto, quando acabar a execução de uma ou mais Threads, queria que a mesma, que acabou a execução, pegasse uma novo objeto e trabalharia o mesmo.
Alguém podeira ajudar?

4 Respostas

C

Isso que você quer saber chama-se Thread Pooling.
Antes de começar a fazer isso preciso saber se você conhece um pouco de teoria sobre Thread, se não, de uma estudada nisso e então as idéias de como implementar irão surgindo na sua cabeça.

Você já implmentou algo com Thread?

Preciso saber isso pra saber como lhe ajudar.

J

O meu código está atualmente assim.

ExecutorService executorService = Executors.newFixedThreadPool(100);
for(int i = 0; i < 100; i++){
   executorService.execute(new ThreadTest( new Test()));
}

Já fiz algumas coisas em Thread sim, mas bem básico…

BrunoBastosPJ

No Java Tutorial tem uma seção que fala sobre Pool de Threads é bem pequeno mas talvez seja interessante dar uma lida.

Pelo nome das suas classes parece que você já está no caminho, talvez seja o caso de colar seu código e dizer onde exatamente você está tendo problemas

http://java.sun.com/docs/books/tutorial/essential/concurrency/pools.html

Abs

J

Estou dando uma olhada na API do java e achei a java.concurrent.ThreadPoolExecutor, parece que pode me ajudar no que eu estou querendo fazer, então fiz um código para testar a mesma e aprender como usá-la. O código segue abaixo:

package test;

import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.SynchronousQueue;

public class TestThread implements Runnable{

        private int name;

        public TestThread(int name){
                this.name = name;
        }

        public void run(){
                System.out.println("THREAD: " + this.name);
        }

        public static void main(String[] args){
                SynchronousQueue<Runnable> sq = new SynchronousQueue<Runnable>();
                TestThread t = new TestThread(1);
                TestThread t1 = new TestThread(2);
                sq.add(t);
                sq.add(t1);
                ThreadPoolExecutor exec = new ThreadPoolExecutor(100, 260, 40, TimeUnit.SECONDS, sq);
                exec.prestartAllCoreThreads();
                exec.shutdown();
        }
}

Só que quando executo o código acima recebo este erro:

Exception in thread "main" java.lang.IllegalStateException: Queue full
        at java.util.AbstractQueue.add(AbstractQueue.java:71)
        at test.TestThread.main(TestThread.java:28)

Alguém já usou esta classe? Sabe oq pode esta acontecendo?

Criado 21 de fevereiro de 2008
Ultima resposta 22 de fev. de 2008
Respostas 4
Participantes 3