如何从线程B停止线程A中的打印?

时间:2014-08-12 16:06:56

标签: java multithreading

我编写了一些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();
    }
}

1 个答案:

答案 0 :(得分:3)

您正在编写并从2个不同的线程中读取布尔变量(closed)而没有任何同步。因此,无法保证您在一个线程中编写的内容在另一个线程中可见。你需要

  • 使布尔变量volatile
  • 使用在同一个锁上同步的块或方法访问布尔变量(写入和读取)
  • 使用AtomicBoolean而不是boolean

我会使用第三种解决方案。