编写一个有 2 个线程的程序,交替打印

新手上路,请多包涵

我最近在一次采访中被问到这个问题。

编写一个包含两个线程(A 和 B)的程序,其中 A 打印 1 ,B 打印 2 等等,直到达到 50。

我们该怎么做呢?

原文由 user2434 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 322
1 个回答

任务的本质是演示一个线程如何向另一个线程发送信号。最常见的方式是使用阻塞队列,但是这里一个信号不携带任何信息,所以一个信号量就足够了。

创建用 2 个信号量参数化的线程类:输入和输出:

 class ThreadPrinter implements Runnable {
    int counter;
    Semaphore ins, outs;

    ThreadPrinter(int counter, Semaphore ins, Semaphore outs) {
        this.counter = counter;
        this.ins = ins;
        this.outs = outs;
    }

    @Override
    public void run() {
        for (int i = 0; i < 25; i++) {
            ins.aquire(); // wait for permission to run
            System.out.println("" + counter);
            outs.release();  // allow another thread to run
            counter += 2;
        }
    }

创建 2 Semaphore 并将它们传递给 2 个线程:

 Semaphore a = new Semaphore(1);  // first thread is allowed to run immediately
Semaphore b = new Semaphore(0); // second thread has to wait
ThreadPrinter tp1 = new ThreadPrinter(1, a, b);
ThreadPrinter tp2 = new ThreadPrinter(2, b, a);

注意信号量 ab 以不同的顺序传递。

原文由 Alexei Kaigorodov 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题