如何在Java中暂停和恢复线程
我正在尝试从另一个类挂起并恢复Java中的线程。我为其编写的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
该程序是在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
尝试更改传感器的状态
类加载器加载它们。过分简化一点,这意味着它们必须在同一个程序中
使用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");
}
}
}