簡體   English   中英

具有可運行接口的Java多線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM