在涉及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?
答案 0 :(得分:7)
Thread pools通常用于不需要synchronization或高parallel的操作。
顺序打印数字0-99不是并发问题,需要同步线程以避免打印失序。
我建议您查看Java concurrency lesson以了解Java中的并发性。
答案 1 :(得分:3)
您问题的最简单的解决方案是使用1的ThreadPool大小。但是,这并不是用线程解决的问题。
要扩展,如果您使用以下命令创建执行程序:
this.exec = Executors.newSingleThreadExecutor();
然后您的线程将按照提交执行的顺序进行调度和执行。在某些情况下,这是合乎逻辑的事情,但在大多数情况下,线程是用于解决此问题的错误工具。
当你需要在不同的线程中执行任务时,这种事情是有意义的 - 可能需要很长时间才能执行,你不想阻止GUI线程 - 但是你不需要需要或不希望提交的任务同时运行。
答案 2 :(得分:3)
线程的想法不是按顺序做事。
您需要一些共享状态才能进行协调。在该示例中,将实例字段添加到外部类将在此示例中起作用。从add中删除参数。添加锁定对象和计数器。抓住锁,增加打印数字,增加数字,释放数字。
答案 3 :(得分:0)
根据定义,问题不适合线程。线程是独立运行的,并没有真正的方法来预测首先运行哪个线程。
如果要将代码更改为按顺序运行,请将添加更改为:
public void add(final String str) {
System.out.println(str);
}
你没有使用线程(至少不是你自己的线程),所有事情都按顺序发生。