Блокировка графики при вычислениях в параллельном потоке
Пытаюсь реализовать шахматные часы, которые представлены двумя public static JLabel; таймер стартую в конструкторе GUI
new Thread(new Runnable() {
public void run() {
clocks.setClock();
}
}).start();
при запуске потока расчёта вариантов компьютером
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
director.compute();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
});
показания не перерисовываются и только после его хода отображается сколько всего было потрачено времени (т.е. сразу +N секунд к предыдущему значению).
Код класса часов:
public class Clocks{
private int minB = 0;
private int secB = 0;
private int minW = 0;
private int secW = 0;
volatile private String turn = " ";
private static Clocks INSTANCE = new Clocks();
public static Clocks getInstance(){
return INSTANCE;
}
synchronized public void setTurn(String turn) {
this.turn = turn;
}
public void setClock() {
while(true) {
try {
Thread.sleep(1000);
if(turn.equals("black")) {
if(secB < 59) {
secB++;
}
else {
secB = 0;
minB++;
}
Gui.clockB.setText(String.format("%02d", minB)+":"+String.format("%02d", secB));
}
else if(turn.equals("white")) {
if(secW < 59) {
secW++;
}
else {
secW = 0;
minW++;
}
Gui.clockW.setText(String.format("%02d", minW)+":"+String.format("%02d", secW));
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
на всякий случай код метода запуска расчётов (находится в другом классе, который является полем класса GUI):
public void compute() throws InterruptedException{
clocks.setTurn("black");
if(endGame("black")){
game.clear();
Gui.lock();
clocks.setTurn(" ");
return;
}
switch(level){
case 0:
case 2:
case 4:
ArtIntel t0 = new ArtIntel(level, board);
t0.run();
break;
case 1:
case 3:
case 5:
case 6:
case 7:
int cores = Runtime.getRuntime().availableProcessors();
List<Node> nodes = Separator.generateNodes(board);
ExecutorService es = Executors.newFixedThreadPool(cores);
for(Node node: nodes){
es.submit(new ArtIntel(node, Copier.deepCopy(board), level));
}
es.shutdown();
es.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
}
integrator.activate(board);
Gui.doClick();
if(endGame("white")){
game.clear();
Gui.lock();
clocks.setTurn(" ");
return;
}
clocks.setTurn("white");
}
Объект clocks везде получен как синглтон.