簡體   English   中英

Java,多線程和Raspberry Pi

[英]Java, MultiThreading, and Raspberry Pi

所以我的多線程部分工作。 當我在編譯后第一次運行程序時,它僅運行3個線程中的1個或2個。 然后立即再次運行它,它在所有線程被激活並運行的情況下運行得非常好。 我想不出任何原因為什么所有線程都不會在java類的第一次執行時運行,然后在第一個類終止后才開始在該類的第二次執行上工作。

我在Raspberry Pi 2上使用Pi4j。我第一次需要代碼才能正常運行,因為我試圖在Pi的啟動時運行它。

這是我開始線程化的地方。

public class Doors {
public static void main(String[] args) {        
    Thread door1 = new Thread(new DoorSwitch(0));
    door1.start();
    Thread door2 = new Thread(new DoorSwitch(1));
    door2.start();
    Thread door3 = new Thread(new DoorSwitch(2));
    door3.start();
}

這就是線程正在運行的東西。 線程傳遞了我所說的門的值。

public class DoorSwitch implements Runnable{    
int p;
int doorID;
int tempPin;
static DBConnection db = new DBConnection();//create a new object of database connection class
public DoorSwitch(int currPin){
p = currPin;
    doorID = (p + 1);
}
public void run()
{
    try{
        final GpioController gpio = GpioFactory.getInstance();
        final GpioPinDigitalInput[] gpPins = {
                 gpio.provisionDigitalInputPin(RaspiPin.GPIO_28, PinPullResistance.PULL_UP),
                 gpio.provisionDigitalInputPin(RaspiPin.GPIO_29, PinPullResistance.PULL_UP),
                 gpio.provisionDigitalInputPin(RaspiPin.GPIO_27, PinPullResistance.PULL_UP),
         };
        for (int i=1; i<gpPins.length; i++){
            if(p == i){
                tempPin = p;
            }
        }
        final GpioPinDigitalInput door = gpPins[tempPin];
        door.addListener(new GpioPinListenerDigital() {
            @Override
            public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
                if(event.getState() == PinState.HIGH){
                    try{
                        db.dbConnection();
                        System.out.println(doorID);
                        System.out.println("Door Open! " + p);
                        String update = "UPDATE `door` SET `status`=" + 1 + " WHERE `id`="+ doorID +";";
                        db.getStatement().executeUpdate(update);
                        String log = "INSERT INTO `door_log` (`door_id`, `status`) VALUES ("+ doorID + ",1);";
                        db.getStatement().executeUpdate(log);
                    } catch (SQLException | ClassNotFoundException | InstantiationException | IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    }
                }
                if(event.getState() == PinState.LOW){
                    try{
                        db.dbConnection();
                        System.out.println(doorID);
                        System.out.println("                Door Closed! " + p);
                        String update = "UPDATE `door` SET `status`=" + 0 + " WHERE `id`="+ doorID +";";
                        db.getStatement().executeUpdate(update);
                        String log = "INSERT INTO `door_log` (`door_id`, `status`) VALUES ("+ doorID + ",0);";
                        db.getStatement().executeUpdate(log);
                    } catch (SQLException | ClassNotFoundException | InstantiationException | IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    }
                }
                //System.out.println(" --> GPIO PIN STATE CHANGE: " + event.getPin() + " = " + event.getState());
            } 
        });
        while(true) {
            Thread.sleep(500);
        }

        // stop all GPIO activity/threads by shutting down the GPIO controller
        // (this method will forcefully shutdown all GPIO monitoring threads and scheduled tasks)
        // gpio.shutdown();   <--- implement this method call if you wish to terminate the Pi4J GPIO controller
    }catch(Exception e){

    }

}

任何幫助將不勝感激。 謝謝

檢查數據庫:共享,在使用時不受保護,並在每個線程中創建。

結果可能無法預測。

我提議:

1添加

 static final Object db_sync=new Object();

2僅初始化一次db,然后在DoorSwitch的構造函數中調用它

static DBConnection db=null;

static db_initialize()
{

synchronized(db_sync)
 {
 if (db==null) 
    db = new DBConnection();//create a new object of database connection class
  }

}

3環繞聲使用db

synchronized(db_sync)
 {
  // Do what you want with db
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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