繁体   English   中英

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

[英]Thread deadlock relevant to methods GetConnection() from DriverManager and next() from Scanner, System.in

关于以下问题,我需要您的帮助:我有两个线程

第一个线程:应该使用标准输入中的Scanner类读取用户的输入

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

并且正在等待整个字符串。 该线程首先到达next()方法。

第二个线程到达之后,正在尝试使用jdbc-odbc打开连接。

连接= 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'");
    }
}

我的程序是否可以使用? Java是否默认加载驱动程序?

在使用JDBC 4 Java 7 ,这是可选的。 它将在类路径中自动找到正确的驱动程序类并加载它。 无需使用Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");加载它Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 但是对于早期版本,您必须这样做。

同样关于死锁问题,如果您真正要说的是,那么您可以在启动线程后调用join()

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

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

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

而且似乎出现了僵局,甚至连扫描仪都在等待用户输入,那么我认为您的连接花费的时间太长。 您可以尝试为此指定超时。 你可以这样做

DriverManger.setLoginTimeout(10);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM