![](/img/trans.png)
[英]distinguish the working of Scanner, System.in, and next() methods that the Scanner class provides in java?
[英]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.