使用run方法启动观察程序线程

时间:2017-03-10 21:46:24

标签: java multithreading state

我有一个

 ThreadPoolExecutor cachedPool = (ThreadPoolExecutor)Executors.newCachedThreadPool();

cachededPool必须在主SimController类中执行以下功能。

观察者线程的运行方法。每秒一次,检查并调用函数。

public void run(){
            if(m.isChanged()){
                m.toString();
            }                   
    }

但它只执行一次run方法。 如何让它每秒运行并创建一个观察者。

3 个答案:

答案 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

    } }