我可以在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();
}
上述过程是否安全?
答案 0 :(得分:3)
是的,它是安全的(假设sendData
本身是安全的),但我不确定你期望它做什么。您编写的代码将创建一个新的线程,它将立即调用sendData()
,然后在sendData
返回后,线程将休眠几秒钟,然后在不做任何其他事情的情况下终止(因此睡眠没有意义,除了防止JVM退出或者Runnable
或其包含的对象被垃圾收集,直到睡眠结束)。如果你希望它在调用sendData
之前等待,那么你需要稍微交换一下。
答案 1 :(得分:3)
在你说的评论中
我所要做的就是每隔特定的秒数(即每15秒)执行一次sendData()方法
然后使用内置的计时器为您组织,例如:
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();
答案 2 :(得分:2)
你试过吗?答案是它确实有效。 Runnable
是由Object
(上例中的匿名类)实现的接口,您可以像传输任何其他对象一样传递/引用它。
请注意,因为上面是一个内部类,所以你将对外部(周围)类有一个隐式引用。