Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';不要在运行期间停止线程,但要进行调试_Java_Multithreading_Swing_Event Dispatch Thread_Thread Sleep - Fatal编程技术网

Java Can';不要在运行期间停止线程,但要进行调试

Java Can';不要在运行期间停止线程,但要进行调试,java,multithreading,swing,event-dispatch-thread,thread-sleep,Java,Multithreading,Swing,Event Dispatch Thread,Thread Sleep,我试图实现一个自动滚动进度条。问题是我不能一开始就阻止它。但是,在逐步调试期间,并且仅在调试期间,它可以正常工作 这是我的代码片段。我们将非常感谢您的帮助 package test; import javax.swing.*; public final class MyTest{ private boolean isvisible = false; private JProgressBar progressbar = new JProgressBar(); /** * thread of

我试图实现一个自动滚动进度条。问题是我不能一开始就阻止它。但是,在逐步调试期间,并且仅在调试期间,它可以正常工作

这是我的代码片段。我们将非常感谢您的帮助

package test;

import javax.swing.*;

public final class MyTest{
private boolean isvisible = false;
private JProgressBar progressbar = new JProgressBar();
/**
 * thread of automatic rolling progress-bar
 */
private Thread proT = new Thread(new Runnable(){
    @Override
    public void run(){
    isvisible = true;
    progressbar.setVisible(true);
    while(true){
        progressBar.setValue((progressBar.getValue() + 20)%100);
        System.out.println(progressBar.getValue()); 
        try{
        Thread.sleep(500);
        }catch(InterruptedException e){
        e.printStackTrace();
        }
        if(!isvisible){
        progressbar.setVisible(false);
        break;
        }
    }
    }
});
/**
 * constructor
 */
public MyTest(){
    //initiate GUI
}
/**
 * show an automatic rolling progress-bar
 */
public void showProgressBar(){
    proT.start();
}

/**
 * stop/veil the progress-bar
 */
public void veilProgressBar(){
    isvisible = false;
}
}

AFAIK isvisible变量应至少为
volatile
,以便其他线程能够注意到它已被更改。您不执行任何同步操作,因此不会更新该值。

AFAIK isvisible变量应至少为
volatile
,以便其他线程能够注意到它已被更改。您不执行任何同步操作,因此不会更新该值。

AFAIK isvisible变量应至少为
volatile
,以便其他线程能够注意到它已被更改。您不执行任何同步操作,因此不会更新该值。

AFAIK isvisible变量应至少为
volatile
,以便其他线程能够注意到它已被更改。您不进行任何同步,因此不会更新值。

这里有一大堆问题:

  • 您正在从非EDT线程上执行Swing GUI更新

  • isvisible变量不是易变的,因此从一个线程所做的更改可能无法从另一个线程看到

  • 而(真的)在线程中睡眠通常是糟糕的设计

  • 您应该在此处使用
    SwingTimer
    ,并安排每X回拨一次以进行更新。当您需要停止更新时,只需取消
    SwingTimer
    并隐藏控件。隐藏也需要从EDT完成,因此您可能需要执行
    SwingUtilities.invokeLater


    可能还有更多的问题,但这是我迄今为止看到的。

    这里有一大堆问题:

  • 您正在从非EDT线程上执行Swing GUI更新

  • isvisible变量不是易变的,因此从一个线程所做的更改可能无法从另一个线程看到

  • 而(真的)在线程中睡眠通常是糟糕的设计

  • 您应该在此处使用
    SwingTimer
    ,并安排每X回拨一次以进行更新。当您需要停止更新时,只需取消
    SwingTimer
    并隐藏控件。隐藏也需要从EDT完成,因此您可能需要执行
    SwingUtilities.invokeLater


    可能还有更多的问题,但这是我迄今为止看到的。

    这里有一大堆问题:

  • 您正在从非EDT线程上执行Swing GUI更新

  • isvisible变量不是易变的,因此从一个线程所做的更改可能无法从另一个线程看到

  • 而(真的)在线程中睡眠通常是糟糕的设计

  • 您应该在此处使用
    SwingTimer
    ,并安排每X回拨一次以进行更新。当您需要停止更新时,只需取消
    SwingTimer
    并隐藏控件。隐藏也需要从EDT完成,因此您可能需要执行
    SwingUtilities.invokeLater


    可能还有更多的问题,但这是我迄今为止看到的。

    这里有一大堆问题:

  • 您正在从非EDT线程上执行Swing GUI更新

  • isvisible变量不是易变的,因此从一个线程所做的更改可能无法从另一个线程看到

  • 而(真的)在线程中睡眠通常是糟糕的设计

  • 您应该在此处使用
    SwingTimer
    ,并安排每X回拨一次以进行更新。当您需要停止更新时,只需取消
    SwingTimer
    并隐藏控件。隐藏也需要从EDT完成,因此您可能需要执行
    SwingUtilities.invokeLater



    可能还有更多,但这是我到目前为止所看到的。

    要更快获得更好的帮助,请发布一个(最简单的完整测试和可读示例)。注意:GUI更新应该在EDT上执行,而我们不应该导致EDT休眠。有关详细信息,请参阅。您是如何尝试停止它的?@TimB我试图通过更改变量isvisible来停止它。@AndrewThompson谢谢您的提示。我刚刚发布了一个未完成的片段,因为实际上我的MCTaRE在运行时没有这样的问题。为了更快地获得更好的帮助,请发布一个(最简单的完整测试和可读示例)。注意:GUI更新应该在EDT上执行,而我们不应该导致EDT休眠。有关详细信息,请参阅。您是如何尝试停止它的?@TimB我试图通过更改变量isvisible来停止它。@AndrewThompson谢谢您的提示。我刚刚发布了一个未完成的片段,因为实际上我的MCTaRE在运行时没有这样的问题。为了更快地获得更好的帮助,请发布一个(最简单的完整测试和可读示例)。注意:GUI更新应该在EDT上执行,而我们不应该导致EDT休眠。有关详细信息,请参阅。您是如何尝试停止它的?@TimB我试图通过更改变量isvisible来停止它。@AndrewThompson谢谢您的提示。我刚刚发布了一个未完成的片段,因为实际上我的MCTaRE在运行时没有这样的问题。为了更快地获得更好的帮助,请发布一个(最简单的完整测试和可读示例)。注意:GUI更新应该在EDT上执行,而我们不应该导致EDT休眠。有关详细信息,请参阅。您是如何尝试停止它的?@TimB我试图通过更改变量isvisible来停止它。@AndrewThompson谢谢您的提示。我刚刚发布了一个不完整的片段,因为实际上我的MCTaRE在跑步时没有这样的问题。