我编写了一些Java代码,它将调用C中断处理程序。
在Java线程A中,我使用waitFor()
等待中断,然后执行reboot。
在Java线程B中,我将循环打印一个计数器值并休眠几毫秒。
我希望当我检测到中断,然后立即停止在线程B中打印,但是失败了。实际上,系统会及时检测到中断,但打印会持续10秒钟,然后重新启动。 注意:重启可能在中断后11秒发生(按一个按钮),硬件速度不快。
以下是我的代码,有什么建议吗?谢谢!
import java.io.IOException;
class ThreadTesterA implements Runnable
{
private int counter;
private String cmds[] = new String[1];
private Process pcs;
@Override
public void run()
{
cmds[0] = "./gpio-interrupt";
try {
pcs = Runtime.getRuntime().exec(cmds);
if(pcs.waitFor() != 0) {
System.out.println("error");
} else {
ThreadTesterB.setClosed(true);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class ThreadTesterB implements Runnable
{
private int i;
private static boolean closed=false;
public static void setClosed(boolean closed)
{
closed = closed;
}
@Override
public void run()
{
// replace it with what you need to do
while (!closed) {
System.out.println("i = " + i);
i++;
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println();
}
}
public class ThreadTester
{
public static void main(String[] args) throws InterruptedException
{
Thread t1 = new Thread(new ThreadTesterA());
Thread t2 = new Thread(new ThreadTesterB());
t1.start();
t1.setPriority(Thread.MAX_PRIORITY);
//t1.join(); // wait t1 to be finished
t2.start();
//t2.join();
}
}
答案 0 :(得分:3)
您正在编写并从2个不同的线程中读取布尔变量(closed
)而没有任何同步。因此,无法保证您在一个线程中编写的内容在另一个线程中可见。你需要
我会使用第三种解决方案。