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