如何在Java中暂停和恢复线程

时间:2015-02-25 00:41:13

标签: java multithreading raspberry-pi

我试图从另一个类中挂起并恢复Java中的线程。我为它写的java代码似乎不起作用 该程序是在raspberry pi中编写的。它监视pi中引脚的状态。我基本上想要做的是通过单击按钮在任何时间点暂停和恢复引脚状态的监视。 我不是一个专业的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");
          }
     }

}

1 个答案:

答案 0 :(得分:1)

您的ActSensorSensor类都有public static void main(...)种方法。所以我认为你可能正在做的是:

  1. 开始Sensor观看图钉
  2. 正在运行ActSensor以尝试更改Sensor
  3. 的状态

    这意味着你在这里不是(只是)两个线程。这是两个整个程序

    这不会像你希望的那样发挥作用。 Java对象可以轻松地相互调用(公共)方法进行通信,但这只有在其中一个对象引用另一个对象时才有效。为了创建这样的引用,您需要使用相同的ClassLoader加载它们。过度简化一点,这意味着他们必须在同一个程序中。

    使用ActSensor启动第二个流程时,您处于不同的流程,因此调用new Sensor()时获得的对象是不同的对象一个在另一个运行程序中。实际上,根本没有无法来获取对其他程序中对象的引用。

    您需要设置进程间通信才能使其工作,而且只需调用方法就可以完成更多的工作。您可以使用Sockets或与它们交互的文件,消息队列或其他内容来采取许多不同的方法。

    或者,您只需要创建一个程序,但这将改变您的用例。您需要Sensor类来启动另一个侦听输入的线程,并采取适当的操作。 (注意:上面的进程间通信实际上也需要这样做)

    很长一段时间,你还有一些工作要做。