[英]java multithreading with runnable interface
嗨,我有兩個線程在JButton動作事件下運行。 第一個線程產生將由第二個線程使用的輸出。 有時這會產生我想要的結果,有時它的強制性偏離了。 我了解,為了獲得正確的結果,我必須添加同步以及wait()和notify()。 我對如何做到這一點一無所知。有人可以通過代碼的方式來幫助我了解如何做到這一點。 這是我到目前為止所做的。
Thread t1;
Thread t2;
t1 = new Thread(new Runnable() {
@Override
public void run() {
fillP(); // this method produces a string which would be used by the query running in thread 2
}
});
t2 = new Thread(new Runnable() {
@Override
public void run() {
String search = txtOFOCOde.getText();
String sql = "Select * from APP.OFOOCCUPATION where OFOOCCUPATIONCODE = '"+search+"'";
try(Connection con = DriverManager.getConnection("jdbc:derby:MTD","herbert","elsie1*#");
PreparedStatement ps = con.prepareStatement(sql);){
ResultSet rs = ps.executeQuery();
if (rs.next()){
String add1 = rs.getString("OFOOCCUPATIONNAME");
OFOOccupation.setText(add1);
}
}
catch(Exception e){
JOptionPane.showMessageDialog(Person.this, e);
}
}
});
t1.start();
t1.notify();
try {
t2.wait();
} catch (InterruptedException ex) {
Logger.getLogger(Person.class.getName()).log(Level.SEVERE, null, ex);
}
t2.start();
對於在何處以及如何放置同步方法感到困惑。
為了清楚起見,我將為您提供有關情況的完整情況,我有一張收集員工數據的表格。 我的問題來自運行方法fillP()的查詢,該查詢填充了一個組合框和一個帶有數據庫值的文本框,例如ITC MANAGER是組合框的值,而教科書的220108值是他的專業代碼。 仍然以相同的形式,線程2中的第二個查詢將提交第三本教科書,這應該是即時完成的,因為只有文本框3是來自線程1的文本框2中的值時,才能填充文本框3。
表單加載,並且在加載時必須運行線程1中的方法FillP()和線程2中的查詢,以便在初始化之后,當用戶對表單可見時,所有3個控件即。 組合框,這2本書將填充來自數據庫兩個不同表的所有數據。 組合和第一課本從JobSpecialisation表獲取輸入,而第三課本從職業表獲取輸入。
您是否絕對在不同線程中調用過代碼? 在我看來,t1和t2中的代碼應該按順序執行(即在同一線程中執行t1的操作,然后執行t2的操作)。
如果您絕對希望在執行t2之前等待t1的完成,那么最好的方法是使用join( https://docs.oracle.com/javase/tutorial/essential/concurrency/join.html )。 join方法只是等待線程的完成,然后處理以下代碼。
在代碼末尾執行以下操作:
t1.start();
try {
t1.join();//wait for t1 to complete
} catch (InterruptedException ex) {
Logger.getLogger(Person.class.getName()).log(Level.SEVERE, null, ex);
}
t2.start();
您的代碼中有一些不良的設計,但這應該可以解決您想要達到的目標。
如果第二個線程仍然必須等待,則可以將它們組合在一起
t1 = new Thread(new Runnable() {
@Override
public void run() {
fillP(); // this method produces a string which would be used by the query running in thread 2
//After fillP() is done, start a new thread
t2 = new Thread(new Runnable() {
@Override
public void run() {
String search = txtOFOCOde.getText();
String sql = "Select * from APP.OFOOCCUPATION where OFOOCCUPATIONCODE = '"++"'";
try(Connection con = DriverManager.getConnection("jdbc:derby:MTD","herbert","elsie1*#");
PreparedStatement ps = con.prepareStatement(sql);){
ResultSet rs = ps.executeQuery();
if (rs.next()){
String add1 = rs.getString("OFOOCCUPATIONNAME");
OFOOccupation.setText(add1);
}
}});
並不需要使用嵌套線程使其變得如此復雜,因為不需要
t1 = new Thread(new Runnable() {
@Override
public void run() {
fillP(); // this method produces a string which would be used by the query running in thread 2
//After fillP() is done, keep going
String search = txtOFOCOde.getText();
String sql = "Select * from APP.OFOOCCUPATION where OFOOCCUPATIONCODE = '"++"'";
try(Connection con = DriverManager.getConnection("jdbc:derby:MTD","herbert","elsie1*#");
PreparedStatement ps = con.prepareStatement(sql);){
ResultSet rs = ps.executeQuery();
if (rs.next()){
String add1 = rs.getString("OFOOCCUPATIONNAME");
OFOOccupation.setText(add1);
}
});
無需使用等待和通知...這可以通過使用一個標志並將fillP()方法完成時將其設置為true來實現
`
volatile boolean checkFlag = false;
Thread t1;
Thread t2;
t1 = new Thread(new Runnable() {
@Override
public void run() {
fillP(); // this method produces a string which would be used by the query running in thread 2
checkFlag = true;
}
});
t2 = new Thread(new Runnable() {
@Override
public void run() {
while(!checkFlag){
Thread.currentThread.sleep(1000)// sleep for 1 second and then poll
}
String search = txtOFOCOde.getText();
String sql = "Select * from APP.OFOOCCUPATION where OFOOCCUPATIONCODE = '"++"'";
try(Connection con = DriverManager.getConnection("jdbc:derby:MTD","herbert","elsie1*#");
PreparedStatement ps = con.prepareStatement(sql);){
ResultSet rs = ps.executeQuery();
if (rs.next()){
String add1 = rs.getString("OFOOCCUPATIONNAME");
OFOOccupation.setText(add1);
}
}
}
catch(Exception e){
JOptionPane.showMessageDialog(Person.this, e);
}
}
});
t1.start();
t2.start();
`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.