在涉及Java线程和并发的世界时,我相当天真。我目前正在努力学习。我做了一个简单的例子来试图弄清楚并发是如何工作的。

这是我的代码:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadedService {

    private ExecutorService exec;

    /**
     * @param delegate
     * @param poolSize
     */
    public ThreadedService(int poolSize) {
        if (poolSize < 1) {
            this.exec = Executors.newCachedThreadPool();
        } else {
            this.exec = Executors.newFixedThreadPool(poolSize);
        }
    }

    public void add(final String str) {
        exec.execute(new Runnable() {
            public void run() {
                System.out.println(str);
            }

        });

    }

    public static void main(String args[]) {
        ThreadedService t = new ThreadedService(25);
        for (int i = 0; i < 100; i++) {
            t.add("ADD: " + i);
        }
    }

}

我需要做什么才能使代码按顺序打印出数字0-99?

有帮助吗?

解决方案

线程池通常用于不需要同步或高度 parallel

顺序打印数字0-99不是并发问题,需要同步线程以避免打印失序。

我建议您查看 Java并发课程了解Java中的并发性。

其他提示

线程的想法不是按顺序做事。

您需要一些共享状态才能进行协调。在该示例中,将实例字段添加到外部类将在此示例中起作用。从add中删除参数。添加锁定对象和计数器。抓住锁,增加打印数字,增加数字,释放数字。

您问题的最简单的解决方案是使用1的ThreadPool大小。但是,这并不是用线程解决的问题。

要扩展,如果您使用以下命令创建执行程序:

this.exec = Executors.newSingleThreadExecutor();

然后您的线程将按照提交执行的顺序进行调度和执行。在某些情况下,这是合乎逻辑的事情,但在大多数情况下,线程是用于解决此问题的错误工具。

当你需要在不同的线程中执行任务时,这种事情是有意义的 - 可能需要很长时间才能执行,而你不想阻止GUI线程 - 但是你不需要需要或不希望提交的任务同时运行。

根据定义,问题不适合线程。线程是独立运行的,并没有真正的方法来预测首先运行哪个线程。

如果要将代码更改为按顺序运行,请将添加更改为:

public void add(final String str) {
    System.out.println(str);
}

你没有使用线程(至少不是你自己的线程),所有事情都按顺序发生。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top