Блокировка графики при вычислениях в параллельном потоке

Пытаюсь реализовать шахматные часы, которые представлены двумя 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 везде получен как синглтон.


Ответы (0 шт):