2

我的情况是,我有两个并发线程,一个不能启动计时器,另一个可以停止计时器。计时器的工作方式是,一旦启动,它将计数到 5 秒并在之后执行一个函数,它将继续执行此操作,直到计时器被另一个线程停止。这如何在 Java 中实现。这就是我所拥有的,我觉得这是错误的做法:

请注意,sleep 是其他两个线程打开和关闭的全局 volatile 变量。

            void creatTime(final EventHandler handler)
            {
                Thread timer = new Thread()
                {
                    public void run()
                    {
                        try
                        {
                            while(true)
                            {
                                while(sleep) Thread.sleep(1000);

                                //invoke function

                            }
                        }
                        catch(IOException e)
                        {
                            System.out.println(e);
                        }
                    }
                };
                timer.start();
            }
            }
4

2 回答 2

4

您可以创建一个TimerTask并安排它每 5 秒运行一次

TimerTask timerTask = new TimerTask() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                //Invoke your function here
            }
        };

//创建一个Timer并安排它

Timer timer = new Timer();

timer.scheduleAtFixedRate(timerTask, 0, 5*1000);

//要终止定时器,你可以调用它的cancel方法。

于 2012-11-06T06:56:19.693 回答
2

我同意 TimerTask 的建议。一般来说,您可以将更多与线程相关的工作传递给 java.util.concurrent 等更高级别的功能就越好。例如,原始代码不处理从睡眠中提前唤醒的问题。

另外,如果重新设计后 sleep 变量仍然存在,则需要将其标记为 volatile 或通过同步的 get 和 set 方法访问。有一组有限的活动确保在一个线程中完成的写入必须对另一个线程中完成的读取可见。

于 2012-11-06T13:43:50.263 回答