Подождите, пока не закончится нить - PullRequest
1 голос
/ 30 апреля 2020

У меня есть функция с внутренним потоком, которая что-то делает

public static void animate(int column,Image image)
{

    new Thread(new Runnable() {
        public void run() {
            try {

                    /* Code */
                    repaint();
                    Thread.sleep(500);
                    repaint();

            } catch (InterruptedException ex) {
            }
        }
    }).start();
}

Функция анимации, которую я вызываю в функции updateBoard, и после этого делаю i ++. Я хочу, чтобы функция animate не продолжала I ++ до конца потока

Внутри animate Функция Я использовал repaint() функцию из свинга, Когда я пытаюсь использовать .join() ее блок repaint() поток.

public static void updateBoard(int column, Image image) {
    int i = 0;
    animate(column,image);
    i++;
}

Ответы [ 2 ]

5 голосов
/ 30 апреля 2020

Вот так:

Thread t = new Thread(new Runnable(){...});
t.start();

t.join();

Однако это бессмысленно. Если вы собираетесь запустить поток и сразу заблокировать его ожидание до конца sh, вы НЕ получите никакого параллелизма. Вы также можете просто вызвать метод Runnable::run в текущем потоке ... и избежать (что немаловажно!) Накладных расходов на создание / запуск потока.

0 голосов
/ 02 мая 2020

У вас уже есть поток, выполняющий метод updateBoard(). Пусть этот поток будет T1.
Вы вызываете animate() и создаете другой поток, пусть этот поток будет T2 . Now as per your question, you want to have T1 и не будет работать до тех пор, пока T2 не завершит выполнение.

Thread.java определяет метод join () , он позволяет одному потоку ожидать завершения другого. В вашем коде это можно сделать следующим образом.

static Thread animationThread = new Thread(new Runnable() {
    public void run() {
        try {
                /* Code */
                Thread.sleep(500);
        } catch (InterruptedException ex) {}
    }
});
public static void updateBoard(int column, Image image) {
    int i = 0;
    animate(column,image);
    animationThread.join(); // this will make the thread executing updateBoard to wait until the completion of animationThread.
    i++;
}
public static void animate(int column,Image image){
    animationThread .start();
}

Но теперь каждая вещь выполняется одна за другой, в этом случае нет смысла использовать два потока. Это похоже на

public static void updateBoard(int column, Image image) {
    int i = 0;
    animate(column,image);
    i++;
}
public static void animate(int column,Image image){
     try {
                /* Code */
                Thread.sleep(500);
        } catch (InterruptedException ex) {}
}

В этом случае также до тех пор, пока метод animate не завершится (без 2-го потока), i ++ не будет выполняться. Следовательно, для варианта использования в вашем вопросе наличие отдельного потока для анимации не имеет смысла, это только увеличивает накладные расходы на создание отдельного потока и переключение контекста. Хотя наличие отдельного потока для анимации кажется хорошей идеей, но для этого вам нужно реструктурировать имеющуюся программу, так как logi c основан на параллельном выполнении, так что наличие нескольких потоков имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...