如果内部为2个线程循环

时间:2014-11-16 01:12:03

标签: java

我无法获得我想要的输出。因此,这些是在关键部分中运行的两个线程。其中一个线程打印" a"和其他打印" b"。线程必须打印到30个字符。之后,接下来的线程打印应该打印一个新行并重置 字符计数器为1.我可以打印它们,但我找不到打印最后一个字符(31)的方法,并将计数器重置为1并打破循环并退出。

我的程序一直在运行,直到你强制它停止,因为我将循环设置为起始点。 我知道我可以通过设置do -while(counter< = 30)来获得它,但我希望它首先设置为while(true) 谢谢你的帮助。

2 个答案:

答案 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