方法返回runnable对象

时间:2013-01-08 12:54:58

标签: java thread-safety runnable

我可以在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();
}

上述过程是否安全?

3 个答案:

答案 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(上例中的匿名类)实现的接口,您可以像传输任何其他对象一样传递/引用它。

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