从run()方法调用另一个类的方法

时间:2020-08-09 21:47:06

标签: java multithreading concurrency java.util.concurrent servlet-listeners

我已经创建了一个调用run方法的调度程序。

@WebListener
public class BaclkgroundJobManager implements ServletContextListener {

    private ScheduledExecutorService scheduler;
    public void contextInitialized(ServletContextEvent sce)  { 

        scheduler=Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(new SomeMinuteJob(), 0, 5, TimeUnit.MINUTES);      
     }
}

此呼叫

public class SomeMinuteJob implements Runnable {

    @Override
    public void run() {
        
        System.out.print("Inside run method");
            ReadData obj= new ReadData();
            obj.readData();
            System.out.println("After reading data");
            }       

}

我在下面创建了ReadData类。

public class ReadData
{
   public void readData()
   {
     System.out.println("I am inside readdata");
   }
}

因此,我在run()方法中创建了ReadData对象,并调用了它的方法。但是控件不是ReadData类的对象。它没有在readData()方法中打印内容。甚至我创建了构造函数并放入了一些内容,尽管那不是打印内容。我该如何解决? 控件正在运行,正在打印Inside run method

1 个答案:

答案 0 :(得分:0)

ScheduledExecutorService的一个常见问题是,如果计划的命令引发异常,则该异常会被静默吞下。问题中的代码似乎没有引发异常,但是在更复杂的代码中,很难避免(例如意外的NullPointerExceptions)

一种快速的解决方法是将所有Runnable.run方法放在try-catch块中:

public class SomeMinuteJob implements Runnable {
    @Override
    public void run() {
        try {
            System.out.print("Inside run method");
            ReadData obj = new ReadData();
            obj.readData();
            System.out.println("After reading data");
        } catch (Exception e) {
            // Log exception
            e.printStackTrace();
        }
    }
}