alguma coisa dentro da classe principal das thread vc precisa mexer ( na minha visao ).
eu trataria com barreiras e semaforo.
um semaforo para travar o fluxo principal e uma barreira para que quando todas as threads finalizassem o servico, ela avisaria o semaforo e o fluxo principal voltaria.
por exemplo, vc tem 1000 threads executando alguma coisa.
no final de cada thread voce avisaria a barreira que “acabou o servico”.
cada thread vai passar pela barreira, decrementar uma unidade e se bloquear.
quando a thread ultima thread passar pela barreira, o codigo dentro da declaracao da barreira é executado e tudo continua normalmente.
dá uma olhada em : http://programmingexamples.wikidot.com/cyclicbarrier
vou botar um codigo aqui, nao sei se vai ajudar ou piorar, tá comentado… mas qualquer coisa avise.
import java.awt.image.WritableRaster;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.Semaphore;
/* @author Arthur F. Zanona */
public class ZhangSuen {
// imagem
private WritableRaster raster;
// ponto de parada
private Boolean houveExclusao = false;
// controle do termino
private CyclicBarrier barreira;
// numero do passo, e ja iniciando no 1
private Integer passo = 1;
// controlando fluxo algoritmo
private Semaphore semaforo = new Semaphore(0);
public ZhangSuen(WritableRaster raster) {
this.raster = raster;
// controlando as threads
this.barreira = new CyclicBarrier( raster.getHeight() - 4, new Runnable() {
// qdo todas as threads estiverem prontas, eu libero o fluxo principal
public void run() {
semaforo.release();
}
});
}
private synchronized void houveExclusao() {
houveExclusao = Boolean.TRUE;
}
public void execute( ) {
houveExclusao = Boolean.FALSE;
do {
houveExclusao = Boolean.FALSE;
// qdo criar todas as threads ele inicia
for (int i = 1; i < raster.getHeight() - 3; i++) {
ThreadChines thread = new ThreadChines( i );
thread.start();
}
// aguardando todas as threads marcarem os pixels para exclusao em toda a imagem
try {
semaforo.acquire();
// como ja excluiu, muda o passo
passo = passo == 1 ? 2 : 1;
// reiniciando a barreira
barreira.reset();
} catch (InterruptedException ex) {System.out.println( ex.getMessage() ); }
// fica nessa até nao houver nada a excluir
} while ( houveExclusao );
}
public class ThreadChines extends Thread {
// linha do processamento
private Integer altura;
// os excluidos
private List<int[]> excluidos = new ArrayList<int[]>();
public ThreadChines(Integer altura) {
this.altura = altura;
}
@Override
public void run() {
super.run();
for ( int largura = 1 ; largura < raster.getWidth() - 3 ; largura++ ) {
Thread.yield();
// declaracao
int[] p1 = new int[3], p2 = new int[3], p3 = new int[3],
p4 = new int[3], p5 = new int[3], p6 = new int[3],
p7 = new int[3], p8 = new int[3], p9 = new int[3];
int conectividade = 0;
int vizinhosPretos = 0;
// resgatando os pixels
raster.getPixel(largura - 1, altura - 1, p9);
raster.getPixel(largura - 1, altura, p8);
raster.getPixel(largura - 1, altura + 1, p7);
raster.getPixel(largura, altura + 1, p6);
raster.getPixel(largura + 1, altura + 1, p5);
raster.getPixel(largura + 1, altura, p4);
raster.getPixel(largura + 1, altura - 1, p3);
raster.getPixel(largura, altura - 1, p2);
raster.getPixel(largura, altura, p1);
Thread.yield();
// conectividade
if ((p1[0] == 0) && (p2[0] == 255) && (p3[0] == 0)) conectividade++;
if ((p1[0] == 0) && (p3[0] == 255) && (p4[0] == 0)) conectividade++;
if ((p1[0] == 0) && (p4[0] == 255) && (p5[0] == 0)) conectividade++;
if ((p1[0] == 0) && (p5[0] == 255) && (p6[0] == 0)) conectividade++;
if ((p1[0] == 0) && (p6[0] == 255) && (p7[0] == 0)) conectividade++;
if ((p1[0] == 0) && (p7[0] == 255) && (p8[0] == 0)) conectividade++;
if ((p1[0] == 0) && (p8[0] == 255) && (p9[0] == 0)) conectividade++;
if ((p1[0] == 0) && (p9[0] == 255) && (p2[0] == 0)) conectividade++;
// vizinhos pretos
if ((p2[0] == 0) && (p3[0] == 0)) vizinhosPretos++;
if ((p3[0] == 0) && (p4[0] == 0)) vizinhosPretos++;
if ((p4[0] == 0) && (p5[0] == 0)) vizinhosPretos++;
if ((p5[0] == 0) && (p6[0] == 0)) vizinhosPretos++;
if ((p6[0] == 0) && (p7[0] == 0)) vizinhosPretos++;
if ((p7[0] == 0) && (p8[0] == 0)) vizinhosPretos++;
if ((p8[0] == 0) && (p9[0] == 0)) vizinhosPretos++;
if ((p9[0] == 0) && (p2[0] == 0)) vizinhosPretos++;
//System.out.println("Conectividade" + conectividade );
//System.out.println("Vizinhos pretos" + vizinhosPretos );
boolean condicaoA = conectividade == 1,
condicaoB = vizinhosPretos >= 2 && vizinhosPretos <= 6,
condicaoC = passo == 1 ? (p2[0] == 255 || p4[0] == 255 || p8[0] == 255) : (p2[0] == 255 || p4[0] == 255 || p6[0] == 255),
condicaoD = passo == 1 ? (p2[0] == 255 || p6[0] == 255 || p8[0] == 255) : (p4[0] == 255 || p6[0] == 255 || p8[0] == 255);
//System.out.println("CondicaoC" + condicaoC );
//System.out.println("CondicaoD" + condicaoD );
if (condicaoA && condicaoB && condicaoC && condicaoD) {
excluidos.add( new int[]{largura, altura} );
}
}
if ( excluidos.size() > 0 ) houveExclusao();
Thread.yield();
try {
// avisa que acabou
barreira.await();
for (int[] e : excluidos) {
raster.setPixel(e[0], e[1], new int[]{255, 255, 255});
}
excluidos.clear();
}
catch (InterruptedException ex) {System.out.println( ex.getMessage() ); }
catch (BrokenBarrierException e) {System.out.println( e.getMessage() ); }
}
}
}