用java实现计时器

用java实现计时器,java,Java,我的情况是,我有两个并发线程,一个不能启动计时器,另一个可以停止计时器。计时器的工作方式是,一旦启动,它将计数到5秒,然后执行一个函数,它将继续这样做,直到计时器被另一个线程停止。如何在Java中实现这一点。这就是我所拥有的,我觉得这样做是错误的: 请注意,sleep是一个全局可变变量,其他两个线程可以打开和关闭它 void creatTime(final EventHandler handler) { Thread

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

请注意,sleep是一个全局可变变量,其他两个线程可以打开和关闭它

            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();
            }
            }

您可以创建一个
TimerTask
,并将其计划为每5秒运行一次

TimerTask timerTask = new TimerTask() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                //Invoke your function here
            }
        };
//创建一个计时器并安排它

Timer timer = new Timer();

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

//要终止计时器,您可以调用其
cancel
方法。

我同意TimerTask的建议。一般来说,与线程相关的工作越多,就越能转移到java.util.concurrent等更高级别的功能上。例如,原始代码不处理从睡眠中早起的问题


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

好吧,我没有看到任何人分配sleep
Boolean
任何值。@Harutyun是的,我没有发布所有代码,代码很长,但很简单,切换已同步的。@ShashankKadne,以便持续检查while条件。那么使用java.util.Timer或ScheduledService有什么问题?@MadProgrammer我结束了使用Timer,谢谢!