Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用if-inside循环2个线程_Java - Fatal编程技术网

Java 使用if-inside循环2个线程

Java 使用if-inside循环2个线程,java,Java,我很难得到我想要的输出。因此,这两个线程在关键部分运行。其中一条线打印“a”,另一条打印“b”。这些线必须打印到30个字符。之后,线程打印下一个应该打印一个新行并重置 将字符计数器设置为1。我可以把它们打印出来,但我找不到打印最后一个字符(31)并将计数器重置为1,然后中断循环并退出的方法 我的程序正在运行,直到您强制它停止,因为我正在将循环设置为起点。 我知道我可以通过设置do-while(counter)来获得它,因为您需要将共享变量设置为volatile,这样它们就不会被每个线程缓存 此外

我很难得到我想要的输出。因此,这两个线程在关键部分运行。其中一条线打印“a”,另一条打印“b”。这些线必须打印到30个字符。之后,线程打印下一个应该打印一个新行并重置 将字符计数器设置为1。我可以把它们打印出来,但我找不到打印最后一个字符(31)并将计数器重置为1,然后中断循环并退出的方法

我的程序正在运行,直到您强制它停止,因为我正在将循环设置为起点。
我知道我可以通过设置do-while(counter)来获得它,因为您需要将共享变量设置为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和原子访问的更多信息:

首先,您不需要两个单独的类(它们扩展线程)来做相同的事情(我知道现在有一点不同,但这是不必要的)。您只需

Thread a = new MyThread().start();
Thread b = new MyThread().start();
其次,您希望两个线程在字符数上进行同步。当前的情况是典型的竞争条件,您需要保护关键部分的代码。要做到这一点,您需要一个同步对象。假设您创建一个对象O并将其传递给每个t线程

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