线程死锁与DriverManager的GetConnection()方法和Scanner,System.in的next()相关

时间:2014-06-16 08:12:53

标签: java multithreading deadlock stdin

关于以下问题,我需要你的帮助: 我有两个帖子

第一个主题:应该使用标准输入的Scanner类读取用户的输入

  

扫描仪扫描仪=新扫描仪(System.in);

并且正在等待整个字符串。这个帖子首先到方法next()。

第二个线程到达并尝试使用jdbc - odbc打开连接。

  

connection = DriverManager.getConnection(“jdbc:odbc:baza”);

正在发生的是方法getConnection()和第二个线程被第一个阻塞。我的问题是为什么会发生这种情况?我怎么能防止这种情况?

我从我的项目中创建了一些小代码,因此更容易阅读..

我感兴趣的另一件事是

  

的Class.forName( “sun.jdbc.odbc.JdbcOdbcDriver中”);

是可选的。我的程序可以使用和不支持吗? java默认加载驱动程序吗?

代码:

public class StartingHere implements Runnable {
    public static void main(String[] args) {
        //SECOND THREAD
        try {
            StartingHere sh =  new StartingHere();
            Thread thread = new Thread(sh);
            thread.start();
            //DELAYING SECOND THREAD. 
            Thread.currentThread().sleep(1000);
            DBConnection dbConnection = new DBConnection();
        } catch (Exception ex) {
            System.out.println("Check db url for in DBConnection");
            ex.printStackTrace();
        }
    }

    @Override
    public void run() {
        //FIRST THREAD - Waiting for user to input String
        String userInput = null;
        Scanner scanner = new Scanner(System.in);
        while(!"end".equals(userInput)) {
            //Waiting for whole string
            userInput = scanner.next();
        }
    }
}

public class DBConnection {
    Connection connection;

    public DBConnection() throws SQLException, ClassNotFoundException {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        // SECOND THREAD- Problem! Here program hangs until FIRST THREAD got some input.. why?
        connection = DriverManager.getConnection("jdbc:odbc:baza");
        System.out.println("DBConnection: 'Connected'");
    }
}

1 个答案:

答案 0 :(得分:-1)

  

我的程序可以使用和不支持吗? java默认加载驱动程序吗?

使用Java 7的{​​{1}}这是可选的。它将自动在类路径中找到正确的驱动程序类并加载它。无需使用JDBC 4加载它。但是对于早期版本,你必须这样做。

关于你的死锁问题,如果你说的真正原因是你可以在启动线程后调用Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

join()

如果您说您的代码正在等待

thread.start();
thread.join();

这似乎是一种死锁情况,因为即使扫描仪正在等待用户输入,那么我认为您的连接需要很长时间才能连接。您可以尝试为此指定超时。你可以通过

来做到这一点
connection = DriverManager.getConnection("jdbc:odbc:baza");