java - 多线程 Hello World

标签 java multithreading

使用两个线程,您应该打印“Hello World Hello World Hello World Hello World Hello World Hello World”。

在两个线程中,一个应该打印“Hello:”,另一个线程“World”。

我可以用不同的类来做到这一点,比如 hello 和 world 各一个 我也可以用内部类来做

有没有一种方法可以让只有一个主类而没有内部类?

最佳答案

Is there a way such that there's only one main class and and no inner class?

当然。您可以传入要打印到主类中的字符串。当然,棘手的部分是协调线程,以便它们实际打印出 "HelloWorld" 而不是 "WorldHello" 或其他排列。线程将在不保证顺序的情况下并行运行。这就是线程程序的全部要点——它们异步运行。试图强制输出特定的单词会否定使用线程的目的。

这让我觉得这是一项设计糟糕的计算机科学作业。用线程编写的全部要点是它们独立并行运行。协调通常发生在每个线程从工作队列中拉取结果然后将结果放入结果队列或其他东西时。任何时候你有一个需要协调这么多的线程程序,你很可能不应该使用线程。

但是,由于每个人都对我之前的回答投了反对票,可能是因为它没有完美解决他们的家庭作业问题,我将添加一些逻辑来协调两个线程并输出“Hello World...”。

这两个线程需要能够锁定某些东西,互相发信号,并且知道它们什么时候应该等待或打印。所以我将添加一个 boolean printHello 并将锁定传入的公共(public)锁对象:

public class HelloWorld implements Runnable {

    private static boolean printHello = true;

    private final String toPrint;
    private final boolean iPrintHello;
    private final Object lock;

    public static void main(String[] args) {
        final Object lock = new Object();
        // first thread prints Hello
        new Thread(new HelloWorld("Hello ", true, lock)).start();
        // second one prints World
        new Thread(new HelloWorld("World ", false, lock)).start();
    }

    public HelloWorld(String toPrint, boolean iPrintHello, Object lock) {
        this.toPrint = toPrint;
        this.iPrintHello = iPrintHello;
        this.lock = lock;
    }

    @Override
    public void run() {
        // don't let it run forever
        for (int i = 0; i < 1000 && !Thread.currentThread().isInterrupted(); ) {
            // they need to synchronize on a common, constant object
            synchronized (lock) {
                // am I printing or waiting?
                if (printHello == iPrintHello) {
                    System.out.print(toPrint);
                    // switch the print-hello to the other value
                    printHello = !printHello;
                    // notify the other class that it can run now
                    lock.notify();
                    i++;
                } else {
                    try {
                        // wait until we get notified that we can print
                        lock.wait();
                    } catch (InterruptedException e) {
                        // if thread is interrupted, _immediately_ re-interrupt it
                        Thread.currentThread().interrupt();
                        return;
                    }
                }
            }
        }
    }
}

关于java - 多线程 Hello World,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15981435/

相关文章:

java - 其中哪些是我的 JDK 路径,哪些是 JAVA_HOME?

java - 电子商务应用程序设计(例如 : Amazon/ebay/flipkart ): Concurrency issues handling

linux - 是否有与 Windows 手动重置事件等效的 UNIX/pthreads?

java - 等待线程间realm-java中的数据更新

java - 单线程性能更好

java - 有没有什么方法可以转义路径字符串中的空格、大括号和其他字符?

java - Java 中以日期格式分割字符串

Java 准备语句 getGeneratedKeys() 错误

Java - Web 应用程序中的线程同步

c# - 多线程同时阻塞主线程