Ik ben al de hele dag bezig met iets in Java proberen te implementeren, maar het wil we maar niet lukken. Ik probeer het volgende te doen: in main een nieuwe database object aanmaken en daar een thread aanmaken die de database connectie probeert te openen. Dan de main thread 10 seconden laten slapen. Als in de tussentijd StartDB_Thread geen notify() heeft gedaan dan zeg ik dat er een timeout is gebeurd en de database niet bereikbaar is. Het probleem is dat die notify() mijn slapende main niet wakker maakt. Ik doe vast iets fout... maar wat?
Helaas moet ik het zo doen omdat DriverManager.setLoginTimeout() niet is geimplementeerd voor HSQLDB en ik anders gewoon 3-4 minuten moet wachten op de connectie als er iets niet klopt. Ook weet ik dat T.stop() niks zal doen omdat de thread is geblokkeerd in een I/O operatie, maar het is alleen een beetje geklungel daar.
In C zou ik het zo doen met gewoon een Event en WaitForSingleObject(), maar kennelijk werkt dat hier anders
.
Helaas moet ik het zo doen omdat DriverManager.setLoginTimeout() niet is geimplementeerd voor HSQLDB en ik anders gewoon 3-4 minuten moet wachten op de connectie als er iets niet klopt. Ook weet ik dat T.stop() niks zal doen omdat de thread is geblokkeerd in een I/O operatie, maar het is alleen een beetje geklungel daar.
In C zou ik het zo doen met gewoon een Event en WaitForSingleObject(), maar kennelijk werkt dat hier anders
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| public class Database implements Runnable { Connection conn; Statement st; public void run() {StartDB_Thread();} public synchronized void StartDB_Thread() { try { Class.forName("org.hsqldb.jdbcDriver"); System.out.println("Opening database connection..."); this.conn = DriverManager.getConnection(conn_string, "sa",""); System.out.println("Database connection opened"); this.st = this.conn.createStatement(); } catch (Exception e) { System.out.println("Exception occured (run)"); e.printStackTrace(); } finally { System.out.println("Waking up waiting thread..."); notify(); } } public synchronized void Database1() throws Exception { Thread T = new Thread(new Database()); T.start(); System.out.println("Database thread started"); try { System.out.println("Database waiting [S]"); wait(10000); System.out.println("Database waiting [E]"); T.stop(); } catch (Exception e) { System.out.println("Timeout exception occured..."); e.printStackTrace(); } } public static void main(String[] args) { Database db = null; try { db = new Database(); db.Database1(); } catch (Exception ex) { ex.printStackTrace(); return; } } |
Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge