java - java中的并发循环

标签 java multithreading concurrency

我想运行两个共享一个方法的线程来打印一些东西。我想要这个作为输出:

a b a b a b 

第一个线程打印“a”,第二个线程打印“b”。我设法打印一次,但我无法包含适当的循环来交换打印件。

我编写了这段代码来执行此操作:

public void run() {
    while(i<10) {
        synchronized(this) {
            while (turn!=turn) {
                try {
                    turn=!turn;
                    wait();
                    sleep(10);
                }
                catch(InterruptedException ie){}
            }

            printThreadOutput();
            turn=!turn;
            i++;
            notifyAll();
        }
    }
}

有什么建议吗?

最佳答案

一个简单的解决方案是使用 java.util.concurrent.locks.Lock ,它将执行所需的所有等待和通知操作:

public class ThreadTest {

    private static final Lock lock = new ReentrantLock();

    public static final void main(String[] args) {
        Runnable aRun;
        Runnable bRun;

        aRun = new Runnable() {
            public void run() {
                while (true) {
                    lock.lock();
                    System.out.println("a");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                    lock.unlock();
                }
            }
        };

        bRun = new Runnable() {
            public void run() {
                while (true) {
                    lock.lock();
                    System.out.println("b");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                    lock.unlock();
                }
            }
        };

        Thread aThread = new Thread(aRun);
        Thread bThread = new Thread(bRun);
        aThread.start();
        bThread.start();
    }

}

如果不使用监视器,你可以这样做,但正如 @noahz 谦虚指出的那样,它使用 Spinlock这效率不高。

public class ThreadTest {

    private static volatile Boolean isATurn = true;

    public static void main(String[] args) {
        Runnable aRun;
        Runnable bRun;

        aRun = new Runnable() {
            public void run() {
                while (true) {
                    while (!isATurn) {
                    }
                    System.out.println("a");
                    isATurn = false;
                }
            }
        };

        bRun = new Runnable() {
            public void run() {
                while (true) {
                    while (isATurn) {
                    }
                    System.out.println("b");
                    isATurn = true;
                }
            }
        };

        Thread aThread = new Thread(aRun);
        Thread bThread = new Thread(bRun);
        aThread.start();
        bThread.start();
    }

}

据我所知,这保证不会出现死锁,但如果其中一个线程没有终止,则可能会出现饥饿,因为另一个线程将等待它。然而,对于像这样的简单示例来说,这不应该构成问题。监视器也更喜欢使用轮询,但参与程度稍高。

关于java - java中的并发循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15725207/

相关文章:

concurrency - 是什么让 Erlang 适合软实时应用程序?

在列表中添加/删除子列表时出现 java.util.ConcurrentModificationException

java - 使用 hibernate 和 mysql 检索多态实体

java - 如何将我的旧 JFrame 转换为 JPanel,以及如何使其像我使用 JFrame 时一样实际工作

c++ - 作为 .dll 的一部分运行 .exe 的 main()

java - 保证并发 Web 服务调用之间数据一致性的最佳执行方法?

java - 哈希表中的并发性和故障安全行为

java - java.lang.Class 方法线程安全吗?

java - 如何在 Java 中向另一个 Time 实例添加时间

c# - 不支持 STA 线程上多个句柄的 WaitAll