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 № 1No 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.