我无法获得我想要的输出。因此,这些是在关键部分中运行的两个线程。其中一个线程打印" a"和其他打印" b"。线程必须打印到30个字符。之后,接下来的线程打印应该打印一个新行并重置 字符计数器为1.我可以打印它们,但我找不到打印最后一个字符(31)的方法,并将计数器重置为1并打破循环并退出。
我的程序一直在运行,直到你强制它停止,因为我将循环设置为起始点。 我知道我可以通过设置do -while(counter< = 30)来获得它,但我希望它首先设置为while(true) 谢谢你的帮助。
答案 0 :(得分:0)
您需要共享变量为volatile
,因此每个线程都不会缓存它们。
此外,由于您无法生成易失性值数组,因此请使用两个布尔值:
volatile int turn;
volatile boolean flag1 = false;
volatile boolean flag2 = false;
volatile int counter = 0;
volatile String cscVar = "a";
volatile String cscVar2 = "b";
要详细了解volatile
和原子访问:The Java™ Tutorials
答案 1 :(得分:0)
首先,你不需要两个单独的类(扩展Thread)来做同样的事情(我现在知道它有一些细微的差别,但这是不必要的)。你可以简单地做
Thread a = new MyThread().start();
Thread b = new MyThread().start();
第二个你想要的是两个线程同步的字符数。您目前拥有的是经典竞争条件,您需要保护关键部分中的代码。为此,您需要一个同步对象。让我们说你做的是创建一个对象O并将其传递给每个线程
Object lock = new Object();
Thread a = new MyThread(lock).start();
Thread b = new MyThread(lock).start();
然后将其保存为成员变量
public MyThread(Object lock) {
this.lock = lock;
}
现在,您在访问共享资源计数器时使用此锁定进行同步。两个线程具有相同的锁定非常重要。
int myCounter;
sychronized (lock) {
if (counter == 30) counter = 0;
else { counter++ }
myCounter = counter; // Make a copy of the shared counter and release the lock
}
// Code to print 'A'+myCounter, or whatrever you want with myCounter. This is your local copy and should be used here