gpt4 book ai didi

java - java中的并发循环

转载 作者:行者123 更新时间:2023-12-02 07:09:25 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com