首页 > 解决方案 > 如何交替运行 2 个线程

问题描述

我是线程新手,我正在尝试使输出看起来像:aAbBcCdDeE...。我搜索并尝试了很多东西,但没有真正使它起作用。在练习中,您应该使用全局布尔变量来执行此操作,但我并没有真正找到任何有用的东西并且有点迷失了。感谢您的帮助!

public class ABCThread implements Runnable {
    char c;

    public ABCThread(char c) {
        this.c = c;
    }

    @Override
    public synchronized void run() {

        for (char i = 0; i < 26; i++) {
            System.out.println(c++);
            try {
                Thread.sleep(500);

            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    public static void main(String[] args) throws InterruptedException {

        Thread t1 = new Thread(new ABCThread('a'));
        Thread t2 = new Thread(new ABCThread('A'));

        t1.start();
        t2.start();

    }

}

输出:

a
A
B
b
C
c
d
D
e
E
f
F
G
g
H
h
I
i
J
j

标签: javamultithreading

解决方案


快速回答:

您不能强制线程在某个时刻运行。不过,您可以做的是让这两个运行“不同步”(与异步编码无关)。

Thread t1 = new Thread(new ABCThread('a'));
Thread.sleep(250);
Thread t2 = new Thread(new ABCThread('A'));

第一个线程大约每 500 毫秒打印一次,第二个线程将在 250、750、1250 等处打印。请注意,这不是在实际程序中解决此问题的正确方法。但是话又说回来,您也可能不会添加Thread.sleep(500)到 run 方法。

更好的:

您需要线程之间的同步。因为您启动了两个线程,所以您可以使用布尔值。

public class ABCThread implements Runnable {
char c;
static boolean synchronizer = false;
boolean runOn;

public ABCThread(char c, boolean runOn) {
    this.c = c;
    this.runOn = runOn;
}

@Override
public synchronized void run() {
    int count = 0;
    while(count < 26)
    {
        if(runOn != synchronizer) 
        {
           Thread.sleep(100);
           continue;
        }
        count++;
        synchronizer = !synchronizer;
        System.out.println(c++);
        
    }

}

    Thread t1 = new Thread(new ABCThread('a', false));
    Thread t2 = new Thread(new ABCThread('A', true));

只是把这个打出来。它可能无法编译。 Thread.sleep(100)只是一些数字。它可能会更低,但对于这个问题并不重要。

更好 之前的代码可以只用 2 个线程运行!1 只会停留在 synchronizer = false 上。如果添加第三个,那么同步器将无法工作,因为它只有 2 个状态。您可以添加一个整数而不是布尔值和另一个整数 amountOfThreads。需要将 amountOfThreads 设置为您将启动的线程数。然后在线程打印时增加原子整数,如果同步器(原子 int)大于 amountOfThreads,则将其设置为 0。


推荐阅读