【问题标题】:Wait until the thread finish等到线程结束
【发布时间】:2020-04-30 10:17:08
【问题描述】:

我有一个内部线程做某事的函数

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++。 我想让函数动画在线程结束之前不会继续到 I++

animate 函数内部,我使用了swing 中的repaint() 函数,当我尝试使用.join() 它的块repaint() 线程时。

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

【问题讨论】:

  • 如果你想要它同步为什么你使用线程?
  • 你能自己弄清楚这句话是什么意思吗:“我使用线程,我想让那个线程在他完成线程之前不能继续下一行。”已经有一个正在运行的线程 T1(它可能是主线程,也可能是其他线程)。然后有一个新线程T2 ...编辑问题以明确。问题对未来的读者来说是很好的参考,所以花点时间让你的问题更容易理解。它现在与您相关,将来对其他人有所帮助。 Stackoverflow 不是个人导师,而是社区为社区服务的。
  • @user207421 因为我想在两行之间做延迟

标签: java multithreading swing


【解决方案1】:

像这样:

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

t.join();

但是,这有点毫无意义。如果您要启动一个线程并立即阻止等待它完成,您将不会获得任何并行性。您也可以在当前线程中调用Runnable::run 方法......并避免创建/启动线程的(不是微不足道的!)开销。

【讨论】:

  • 我不明白你在说什么,或者它与你提出的问题有什么关系。
【解决方案2】:

您已经有一个执行updateBoard() 方法的线程。让这个线程成为T1
您调用 animate() 并创建另一个线程,让该线程为 T2. Now as per your question, you want to have T1T2 完成执行之前不要继续运行。

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 方法完成(没有第二个线程),否则不会执行 i++。因此,对于您的问题中的用例,为动画设置单独的线程是没有意义的,它只会增加创建单独线程和上下文切换的开销。虽然有一个单独的动画线程似乎是个好主意,但为此你必须重组你拥有的程序,因为逻辑是基于并行执行的,所以拥有多个线程是有意义的。

【讨论】:

  • 它不起作用..可能是因为我在动画功能中使用 - repaint() 来更改图像,当我写 animationThread.join() 块重绘线程
  • 在问题中添加这些细节以使其清楚。清楚地提及函数中正在执行的操作,并且您还必须了解线程的工作方式。当您说“阻止重绘线程”时,我真的什么都听不懂,是否有一种方法 repaint 可以创建另一个线程,如果是这样,它是如何被阻止的,您是在谈论线程 T1 吗?通常有一个主 UI 线程,然后还有其他线程,如果这与 android、swing、java fx 或什么有关,还请提及。标记问题的上下文。
  • 你是对的,我的错。我再次更新了问题,我的意思是摇摆
  • i 的作用是什么?你能让它成为动画本身定义的线程的一部分吗?您通过定义线程寻求的优势是什么?如果您的进一步执行无法继续进行,那么拥有单独线程的目的是什么?
  • 我希望 i 在我完成线程后执行。我使用线程是因为我想在函数内部更改图像时延迟animate 函数
猜你喜欢
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 2021-11-03
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多