0

私はjsfを使ってJava eeアプリケーションを書いています。データベースを定期的に更新するなど、いくつかのバックラウンド プロセスを定義しました。コードは次のとおりです。

public class AppServletContextListener implements ServletContextListener{
    @Override
public void contextInitialized(ServletContextEvent arg0) {
    zamanli zm = new zamanli();
        try {   
            zm.programBasla();
        } catch (MalformedURLException ex) {
            Logger.getLogger(AppServletContextListener.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(AppServletContextListener.class.getName()).log(Level.SEVERE, null, ex);
        }
}       
}

そしてクラス:

public class zamanli {
    public void programBasla() throws MalformedURLException, IOException {
    int delay = 5000; //5 sn sonra başlar
    int period = 600000; //10 dkda tekrar
    Timer timer = new Timer();
    TimerTask task = new TimerTask() {
        @Override
        public void run() {

            Runtime r = Runtime.getRuntime();
            Process p = null;

            try {
                //  p = r.exec("c:\\WINDOWS\\system32\\calc");
                System.out.println(Now());

            } catch (Exception e) {

                System.out.println("Çalışmadı");
            }
            try {
                getCurrentExchangeValue();
            } catch (MalformedURLException ex) {
                Logger.getLogger(zamanli.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(zamanli.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    };

問題は、プログラムが終了した後、プロジェクトを閉じてもデータベースが更新され続けることです。では、プログラムが閉じたときにスレッドを強制終了するにはどうすればよいですか?

ありがとう

4

2 に答える 2

2

ScheduledExecutorService代わりに を使用し、通常のスレッドの代わりにデーモン スレッドを生成するTimerを使用します。ThreadFactory

private static final ThreadFactory THREAD_FACTORY = new ThreadFactory()
{
    private final ThreadFactory factory = Executors.defaultThreadFactory();

    @Override
    public Thread newThread(final Runnable r)
    {
        final Thread ret = factory.newThread(r);
        ret.setDaemon(true);
        return ret;
    }
};

// ...
private final ScheduledExecutorService service
    = Executors.newSingleThreadScheduledExecutor(THREAD_FACTORY);

//...
service.scheduleAtFixedRate(etc etc);

service参照できるようcontextDestroyed()にすると、さらに簡単になります。その後、デーモン スレッドを使用する必要はなく、デーモン スレッドを呼び出すだけservice.shutdownNow()で済みます。

于 2013-07-12T10:48:29.383 に答える