我有一个
ThreadPoolExecutor cachedPool = (ThreadPoolExecutor)Executors.newCachedThreadPool();
cachededPool
必须在主SimController
类中执行以下功能。
观察者线程的运行方法。每秒一次,检查并调用函数。
public void run(){
if(m.isChanged()){
m.toString();
}
}
但它只执行一次run方法。 如何让它每秒运行并创建一个观察者。
答案 0 :(得分:0)
您可以在评论中使用Peter Lawrey建议的ScheduledExecutorService.scheduleAtFixedRate()
,或者您可以执行以下操作:
public void run() throws InterruptedException {
for( ;; ) {
if( m.isChanged() ) //hopefully m is thread-safe
m.toString(); //hopefully something more meaningful here
Thread.sleep( 1000 ); //1000 milliseconds is one second.
}
}
注意:如果您的run()
方法无法抛出InterruptedException
,那么您需要处理InterruptedException
可能引发的Thread.sleep()
。快速而肮脏的方法就是说try{ ... } catch( InterruptedException e ) { throw new AssertionError( e ); }
但是如果你想以正确的方式做到这一点,那么一定要阅读:Handling InterruptedException in Java
答案 1 :(得分:0)
ScheduledExecutorService使这个非常简单,因为这个例子每秒打印一次日期,显示:
public class MonitorService {
public static void main(String[] a) throws Exception {
ScheduledExecutorService service =
Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(() -> {
System.out.println(LocalDateTime.now());
}, 0, 1, TimeUnit.SECONDS);
}
}
如果您要在系统中安排多个作业,则需要在所有任务中共享预定的执行程序服务以提高效率。
答案 2 :(得分:0)
如果您使用的是Spring,那么您还可以在方法上使用@Scheduled任务来运行计划任务。
@Component
@EnableScheduling
public class TestClass {
@Scheduled(fixedRate= 1000 , initialDelay = 18000)
public void TestMethod(){
// Do Something
} }