繁体   English   中英

Java线程教程类型问题

[英]Java Threading Tutorial Type Question

当谈到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-99不是并发问题,需要同步线程以避免乱序打印。

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

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

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

this.exec = Executors.newSingleThreadExecutor();

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

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

线程的想法不是按顺序执行。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM