在新线程中启动后台服务冻结主应用程序

时间:2013-02-11 12:48:15

标签: java multithreading

我正在使用按钮在我的应用中启动后台服务。这是我正在使用的代码:

@Override
public void actionPerformed(ActionEvent action) {
    if (action.getActionCommand().equals("Start")) {
        while (true) {
            new Thread(new Runnable() {
                public void run() {
                    System.out.println("Started");
                }
            }).start();

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

这会每秒更新一次服务,这就是我想要的。问题是它冻结了应用程序的其余部分。我如何实现它以便不会发生这种情况?

4 个答案:

答案 0 :(得分:1)

以下内容可能会导致您的应用暂停:

    while (true) {
        ...
    }

尝试删除这些行。

编辑:根据注释,要使新启动的线程每秒触发一次,请在run()方法中移动sleep和while循环:

if (action.getActionCommand().equals("Start")) {
    new Thread(new Runnable() {
        public void run() {
            while (true) {
                System.out.println("Started");        }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
       }
   }).start();
}

答案 1 :(得分:0)

您在更新GUI的线程中调用此方法,这就是暂停GUI刷新。产生一个新线程并在那里执行。

答案 2 :(得分:0)

无限循环? while (true) {.....}

你应该怎么离开这里 - 在循环内添加一个打印语句,你会发现你在点击按钮后被困在这里

答案 3 :(得分:0)

好的我明白了。这就是我应该做的:

@Override
public void actionPerformed(ActionEvent action) {
    if (action.getActionCommand().equals("Start")) {
        new Thread(new Runnable() {
            public void run() {
                while (true) {
                    System.out.println("Started");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}