2015-02-25 3 views
-2

Я пытаюсь приостановить и возобновить поток в Java из другого класса. Код java, который я написал для него, похоже, не работает.
Программа написана внутри малины pi. Он контролирует состояние булавки в пи. В основном я хочу приостановить и возобновить мониторинг состояния контактов в любой момент времени одним нажатием кнопки. Я не профессиональный Java-программист, поэтому я мог бы сделать что-то не так. Пожалуйста, присмотритесь к прилагаемому коду и скажите мне, что я делаю неправильно.Как приостановить и возобновить поток в Java

// ЭТО КЛАСС, ЧТО Я хочу управлять из другого класса

import com.pi4j.io.gpio.GpioController; 
import com.pi4j.io.gpio.GpioFactory; 
import com.pi4j.io.gpio.GpioPinDigitalInput; 
import com.pi4j.io.gpio.PinPullResistance; 
import com.pi4j.io.gpio.PinState; 
import com.pi4j.io.gpio.RaspiPin; 
import java.io.*; 
import java.net.*; 

public class Sensor { 
    static boolean threadSuspended; ///// 
    public static void main(String[] args) throws InterruptedException { 
     final int PortNumber = 400; 

     // create gpio controller 
     final GpioController gpio = GpioFactory.getInstance(); 
     // provision gpio pin #07 as an input pin with its internal pull down resistor enabled 
     final GpioPinDigitalInput myDoor = gpio.provisionDigitalInputPin(RaspiPin.GPIO_07, PinPullResistance.PULL_DOWN); 

     while(true){ 
      boolean MySensor1 = myDoor.isHigh(); 
     Thread.sleep(20000); 
      if (MySensor1 == true) { 
      System.out.println("The Door is Closed"); 
      } 
      else { 
      System.out.println("The Door is Open"); 
      String[] arg = {}; 
      DoorOpen.main(arg); 
      } 

     Thread t = new Thread(){ 
      public void run(){ 

       System.out.println("Server is running and listening"); 
       try { 
        Thread.sleep(300); 
        synchronized(this) { 
        while(threadSuspended) 
         wait(); 

        } 
      ServerSocket SensorSock = new ServerSocket(PortNumber); 
      while(true){ 
      Socket clientSock = SensorSock.accept(); 
      InputStreamReader IR = new InputStreamReader(clientSock.getInputStream()); 
      BufferedReader BR = new BufferedReader(IR); 
      String Message = BR.readLine(); 
      System.out.println(Message); 
      if(Message != null){ 
       boolean MySensor = myDoor.isHigh(); 
       if (MySensor == true) { 
        PrintStream PS = new PrintStream(clientSock.getOutputStream()); 
        PS.println("The Door is Closed"); 
        } 
       else { 
        PrintStream PS = new PrintStream(clientSock.getOutputStream()); 
        PS.println("The Door is Open"); 
       } 
       } 
      clientSock.close(); 
      } 
     } 
     catch (IOException e) { 
      System.out.println("Exception caught when trying to listen on port " 
        + PortNumber + " or listening for a connection"); 
      System.out.println(e.getMessage()); 
     } 
    } 
    }; 
    t.start(); 
    }  
} 

// ЗДЕСЬ метод, который должен приостанавливать и возобновлять Нить

public synchronized void ButtonPressed() { 

     threadSuspended = !threadSuspended; 

     if (!threadSuspended) 
      notify(); 
    } 
} 

// ЭТА КЛАСС УПРАВЛЕНИЕ Другого класса с помощью вызова метода ButtonPressed()

public class ActSensor { 
    public static void main(String args[]) { 
     Sensor s = new Sensor(); 

     try { 
      Thread.sleep(1000); 
      s.ButtonPressed(); 
     } 
     catch (InterruptedException e) { 
      System.out.println("Main thread Interrupted"); 
      } 
    } 

} 
+0

Почему этот помеченный Android? Разве это не Pi4J для RasPi? – DeadChex

+0

вы никогда не покидаете первый цикл while – Zielu

+0

Используйте CountDownLatch http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html –

ответ

1

У ваших ActSensor и Sensor классов есть public static void main(...) методов. Так что я думаю, что вы, вероятно, делают это:

  1. Начиная Sensor смотреть булавку
  2. Запуск ActSensor, чтобы попытаться изменить состояние Sensor

Это означает, что у вас есть здесь ISN 't (просто) два потока. Это два целых программ.

Это не будет работать так, как вы надеетесь. Объекты Java могут легко вызывать (общедоступные) методы друг для друга, но это работает только тогда, когда один из объектов имеет ссылку на другую. Чтобы создать такую ​​ссылку, вам нужно, чтобы оба они были загружены одним и тем же ClassLoader. Из-за упрощения, это означает, что они должны быть в одной программе.

При запуске второго процесса с ActSensor, вы находитесь в другом процессе, так что объект, который вы получаете, когда вы звоните new Sensor() это другой объект из одного в другой работающей программе. Фактически, есть никак не, чтобы получить ссылку на объект в другой программе вообще.

Вам необходимо настроить межпроцессную связь, чтобы сделать эту работу, и это будет больше работы, чем просто вызов метода. Существует множество различных подходов, которые вы можете использовать с помощью Sockets или файла, с которым они взаимодействуют, очереди сообщений или чего-то еще.

В качестве альтернативы, вам нужно сделать это только одной программой, но это изменит ваш прецедент. Вам понадобится класс Sensor, чтобы запустить другой поток, который прослушивает ввод, и предпринимает соответствующие действия. (Примечание: это действительно потребуется для межпроцессного взаимодействия выше)

Короче говоря, у вас есть над чем работать.

Смежные вопросы