ScheduledExecutorService只循环一次

时间:2012-07-07 23:10:04

标签: java multithreading

我正在尝试实现一个每秒循环的ScheduledExecutorService线程,但截至目前它只循环一次。

我的问题是如何设置它以便周期性循环而不是一次迭代?

另外,如何将连接池传递给线程,以便每次迭代都可以查询数据库?非常感谢任何帮助。

public static void main(String[] args) throws InterruptedException {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    AdminManager frame = new AdminManager();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        });

        BoneCP connectionPool = null;
        Connection connection = null;

        try {
            // load the database driver (make sure this is in your classpath!)
            Class.forName("com.mysql.jdbc.Driver");
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }

        try {
            // setup the connection pool
            BoneCPConfig config = new BoneCPConfig();
            config.setJdbcUrl("jdbc:mysql://192.0.0.1:3306/database"); // jdbc url specific to your database, eg jdbc:mysql://127.0.0.1/yourdb
            config.setUsername("root"); 
            config.setPassword("");
            connectionPool = new BoneCP(config); // setup the connection pool

            connection = connectionPool.getConnection(); // fetch a connection

            if (connection != null){
                System.out.println("Connection successful!");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

        ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
        exec.schedule(new Runnable(){
            @Override
            public void run(){
                System.out.println("Working ... ");

            }
        }, 1, TimeUnit.SECONDS);

        //connectionPool.shutdown(); // shutdown connection pool.
}

1 个答案:

答案 0 :(得分:3)

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html

有scheduleAtFixedRate方法。 要将某些内容传递给匿名类,需要将其声明为final。 它需要在同一范围内。

此外,您现在拥有的代码是关闭连接,如果您打算将其传递给另一个线程,则需要将其保持打开状态。

!编辑一些示例代码

public class Whatever {
    public static void main(String[] args) throws Exception {
        // ... do your frame thing

        loadDataBaseDriver();
        BoneCP connectionPool = createConnectionPool();

        try {
            final Connection connection = connectionPool.getConnection();
            ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();

            exec.scheduleAtFixedRate(new Runnable(){
                @Override
                public void run(){
                    System.out.println("Working ... ");

                    // use connection
                }
            }, 0, 1, TimeUnit.SECONDS);
        } catch (SQLException e) {
          // do whatever
        }
    }

    public static BoneCP createConnectionPool() throws SQLException {
        BoneCPConfig config = new BoneCPConfig();
        config.setJdbcUrl("jdbc:mysql://192.0.0.1:3306/database"); // jdbc url specific to your database, eg jdbc:mysql://127.0.0.1/yourdb
        config.setUsername("root"); 
        config.setPassword("");
        connectionPool = new BoneCP(config);
        return connectionPool;
    }

    public static void loadDataBaseDriver() {
        try {
            // load the database driver (make sure this is in your classpath!)
            Class.forName("com.mysql.jdbc.Driver");
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }
    }

}

我不知道您正在调用的方法的签名,因此可能会出错 是错的