线程死锁与来自DriverManager的GetConnection()方法和来自Scanner、systemin的ne



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

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

Scanner = new Scanner(System.in);

正在等待整个字符串。这个线程首先获得了方法next()的

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

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

发生的是方法getConnection()和第二个线程被第一个线程阻塞。我的问题是为什么会这样?我怎样才能避免呢?

我已经从我的项目中创建了小代码,所以它更容易阅读…

我更感兴趣的是为什么

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 4Java 7,这是可选的。它将自动在类路径中找到正确的驱动程序类并加载它。不需要使用Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");加载它。但是对于更早的版本,你必须。

关于你的死锁问题,如果你所说的原因是真的,那么你可以在启动线程后调用join()

thread.start();
thread.join();
如果你说你的代码在 等待
connection = DriverManager.getConnection("jdbc:odbc:baza");

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

DriverManger.setLoginTimeout(10);

最新更新