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

如何在Java中暂停和恢复线程,java,multithreading,raspberry-pi,Java,Multithreading,Raspberry Pi,我正在尝试从另一个类挂起并恢复Java中的线程。我为其编写的java代码似乎不起作用。 该程序是在raspberry pi中编写的。它监视pi中引脚的状态。我基本上想做的是通过点击按钮在任何时间点暂停并恢复对pin状态的监视。 我不是一个专业的Java程序员,所以我可能做错了什么。 请任何人看一下附件的代码,告诉我我做错了什么 //这是我想从另一个类控制的类 import com.pi4j.io.gpio.GpioController; import com.pi4j.io.gpio.GpioF

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


您的
ActSensor
Sensor
类都有
publicstaticvoidmain(…)
方法。所以我认为你可能正在做的是:

  • 启动传感器以观察针脚
  • 运行
    ActSensor
    尝试更改
    传感器的状态
  • 这意味着你这里的不是(仅仅)两个线程。这是两个完整的程序

    这不会像你希望的那样起作用。Java对象可以很容易地相互调用(公共)方法进行通信,但这仅在其中一个对象引用另一个对象时才起作用。为了创建这样的引用,需要由相同的
    类加载器加载它们。过分简化一点,这意味着它们必须在同一个程序中

    使用
    ActSensor
    启动第二个进程时,您处于不同的进程中,因此调用
    new Sensor()
    时得到的对象与另一个正在运行的程序中的对象不同。事实上,根本无法在另一个程序中获得对该对象的引用

    您需要设置进程间通信来实现这一点,这将比仅仅调用一个方法要复杂得多。使用
    Sockets
    或它们都与之交互的文件、消息队列或其他东西,可以采取许多不同的方法

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


    长话短说,你有一些工作要做。

    为什么这个标签是Android?Pi4J不是为RasPi设计的吗?当使用CountDownLatch@deachex时,你永远不会离开第一个循环。是的,程序是在raspberry pi中编写的。它监视pi中引脚的状态。我基本上想做的是通过点击一个按钮在任何时间点暂停并恢复对pin状态的监控。您有两种
    main
    方法。这意味着您在两个进程中运行,这意味着两个JVM。你没有两条线。简单地在两个程序中使用同一个类将不允许它们相互对话。您需要建立某种进程间通信。
    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");
              }
         }
    
    }