2

我可以在 Java 中做这样的事情吗:

 protected Runnable getRunnable(final int seconds) {
    Runnable runnable = new Runnable() {
        public void run() {
                sendData();             
                try {
                    Thread.sleep(seconds * 1000);
                } 
                catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
        }
    };
    return runnable;
}

进而:

protected void startTimer(int seconds) throws InterruptedException,NullPointerException {
    Thread thread = new Thread(getRunnable(seconds));
    thread.start();
}

上述过程安全吗?

4

3 回答 3

3

是的,它是安全的(假设sendData它本身是安全的),但我不确定你期望它做什么。您编写的代码将创建一个新线程,该线程将立即调用sendData(),然后在sendData返回后线程将休眠几秒钟,然后终止而不做任何其他事情(因此休眠是没有意义的,除了阻止 JVM 退出Runnable或其包含的对象不会被垃圾收集,直到睡眠完成)。如果您希望它在调用之前sendData等待,那么您需要稍微交换一下。

于 2013-01-08T13:02:38.163 回答
3

在你说的评论中

我要做的就是每隔特定的秒数(即每 15 秒)执行一次 sendData() 方法

然后使用一个内置的 Timer 来为你组织,例如:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable r = new Runnable() {
    @Override
    public void run() {
        sendData();
    }
};
ScheduledFuture<?> future = scheduler.scheduleAtFixedRate(r, 0, 15, TimeUnit.SECONDS);

//when you want to cancel the scheduled task
future.cancel(true);

//and before you leave your program, don't forget to call:
scheduler.shutdown();
于 2013-01-08T13:36:16.733 回答
2

你试过了吗?答案是它确实有效。Runnable是由Object(上面示例中的匿名类)实现的接口,您可以像任何其他对象一样传递/引用它。

请注意,因为上面是一个内部类,所以您将隐式引用外部(周围)类。

于 2013-01-08T12:57:50.773 回答