当私有实例变量超出范围时,Java终止线程

时间:2015-09-21 17:38:11

标签: java multithreading runnable executorservice

我计划一个动态打开与数据库的连接以存储某些设置的类。 如果在特定时间内未使用或者调用方法结束,则类应自动关闭连接。

到目前为止,这是我的解决方案,仅显示相关部分:

public class DBSettings {
    // ...
    private int ConnectionTimeout = 5000; 
    private ExecutorService Executor;
    private long LastTimeUsed;  
    // ...

    public DBSettings(DBConnection Conn) {
        Connection = new DBConnection(); // class handles Connection to Database
        // ...
    }

    private void connect() {
        try {
            if (!Connection.isOpen()) {
                Connection.openConnection(DBUrl, DBUserName, DBPassword);
                LastTimeUsed = System.currentTimeMillis();
                Executor = Executors.newSingleThreadExecutor();

                Runnable closeRunnable = new Runnable() {
                    @Override
                    public void run() { 
                        while (System.currentTimeMillis() < (LastTimeUsed + ConnectionTimeout)) {
                            try {
                                Thread.sleep(500);
                            } catch (InterruptedException e) { }
                        }
                        disconnect(); 
                    }
                };

                Executor.submit(closeRunnable);
            }
        } catch (Exception e) { // ... }
    }

    private void disconnect() {
        if (Connection!=null) {
            if (Executor!=null) {
                Executor.shutdown();
            }
            Connection.closeConnection();
        }
    }

    public void setValue(String group, String key, String value) {
        // ...
        LastTimeUsed = System.currentTimeMillis();
    }
}

ExecutorService在5秒后停止并且连接关闭。 但不幸的是,如果调用者方法结束,则会持续运行至少5秒。

我的测试程序:

private static void testDBSettings(DBConnection Conn) {
    // using my class
    DBSettings settings = new DBSettings(Conn);
    // set first value, open connection
    settings.setValue("Groupname", "Keyname", "Value");  
    Thread.sleep(1000);
    // set second value, extend connection lifetime
    settings.setValue("otherGroupname", "otherKeyname", "otherValue");  
    Thread.sleep(1000);
    // here is the problem: after "settings" goes out of scope my class should 
    // stop or terminate the ExecutorService without the need to call an extra method.
}

我读了很多关于线程的内容,但无法找到解决方案。

使用ScheduledExecutorService尝试了另一种方法 - 结果相同。

finalize()不起作用,因为它只被垃圾收集调用。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

无法在java中跟踪此内容。

您最近可以使用try-with-resource

try(MyClass myClass = new MyClass()){
    myClass.doSomething();

} // Here myClass.close(); will be called.