/ / Multiple Threading em java [duplicado] - java, multithreading

Múltiplo Threading em java [duplicado] - java, multithreading

Error:
Exception in thread "Thread-2200" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Unknown Source)
at problem1.solvinging$solver.distancecalculator(Orienteering.java:107)
at problem1.solveing$solver.run(Orienteering.java:165)

Classe:

public void distancecalculator(char [][]problem  , int distancefound) {

Point p = new Point();
LinkedList<Point> q = new LinkedList<>();
q.add(origin);
int []x = {1,-1,0,0};
int []y = {0,0,1,-1};


dist[0][0] = distancefound;
while(!q.isEmpty()) {

p = q.getFirst();
for(int i = 0; i < 4; i++) {

int a = p.x + x[i];
int b = p.y + y[i];

if(a >= 0 && b >= 0 && a < m && b < n && dist[a][b]==2) {

dist[a][b] = 1 + dist[p.x][p.y] ;

if(k>0) {
solver s = new solver(newproblem,dist[a][b]);
new Thread(s).start();
}

Estou recebendo o erro acima no meu programa ao executá-lo
Mas o programa ainda está em execução
Como eu corrijo por favor me ajude
Agradecemos antecipadamente. Sugerir novas edições, se necessário

Respostas:

1 para resposta № 1

No código que você forneceu, não há lugar onde você remove elementos de LinkedList<Point> q. o getFirst() método não remove o primeiro elemento. E provavelmente por causa disso você criou um loop infinito, que cria um novo thread em cada execução.

Experimentar pollFirst() em vez de.

EDITAR APÓS EXPLICAÇÃO DE PERGUNTAS EM COMENTÁRIOS

O que você pode fazer para limitar o número de encadeamentos é usando o pacote java.util.concurrent, ou seja, Semáforo. Antes de criar uma nova chamada de thread acquire mehotd no semapohre. Adicione o semapohre objeto para o solver construcotor, de modo que quando o solver acabamentos ele pode chamar o release() mehtod nesse objeto solucionador.

Experimente o código abaixo para ver como isso funcionaria:

public class Main
{
public static void main(String args[])
{
new Main().run();
}

private void run()
{
Semaphore semaphore = new Semaphore(5, true);
for (int i = 0; i<6; i++)
{
try
{
semaphore.acquire(1);
new TestThread(i, semaphore).start();
}
catch (final InterruptedException e) {}

}
}

class TestThread extends Thread
{
private Semaphore semaphore;
private Integer id;

TestThread(final Integer id, final Semaphore semaphore)
{
this.semaphore = semaphore;
this.id = id;
}

@Override
public void run()
{
System.out.println("Thread " + id + " has started.");
try
{
Thread.sleep(5000);
}
catch (final InterruptedException e) {}
System.out.println("Thread " + id + " has stopped.");
semaphore.release(1);
}
}
}

Existem 6 threads que precisa ser run, mas o semaphore permite apenas 5 de cada vez. Então o sexto tem que esperar. Todos threads faça apenas uma coisa - espere 5 segundos. Então o sexto thread tem que esperar os 5seg para que um dos outros threads possa terminar, e então ele pode começar.

Saída:

Thread 2 has started.
Thread 4 has started.
Thread 5 has started.
Thread 3 has started.
Thread 1 has started.
Thread 4 has stopped.
Thread 2 has stopped.
Thread 6 has started.  //here the sixth thread has started - as soon as the other ones finished.
Thread 1 has stopped.
Thread 3 has stopped.
Thread 5 has stopped.

0 para resposta № 2

Muito provavelmente você tem loop infinito que causa OutOfMemoryError. Verifique q pode estar vazio.


0 para resposta № 3

Você deve ser cauteloso ao criar tópicos, especialmente sobre o número deles, porque eles são LIMITADO recurso. Aqui você tem um while loop e dentro de você tem um for loop e dentro desse loop você está criando um Thread. Você não tem ideia de quantos segmentos seu programa java está solicitando do SO subjacente, então o SO nega, provavelmente diz "COMO SOBRE UM NÃO?" para a JVM e, em seguida, a JVM fornece essa mensagem como OutOfMemoryError . Tente otimizar seu código.