【问题标题】:Java Threading Tutorial Type QuestionJava 线程教程类型问题
【发布时间】:2010-10-10 20:12:39
【问题描述】:

在谈到 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?

【问题讨论】:

    标签: java multithreading concurrency threadpool


    【解决方案1】:

    根据定义,该问题不适合线程。线程是独立运行的,实际上并没有办法预测哪个线程首先运行。

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

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

    您没有使用线程(至少不是您自己的线程),而且一切都是按顺序发生的。

    【讨论】:

    • 这不是练习的重点。我提供的示例并不是我真正要使用的东西。我想更好地理解线程和同步。
    【解决方案2】:

    解决问题的最简单方法是使用大小为 1 的 ThreadPool。但是,这并不是真正需要使用线程来解决的问题。

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

    this.exec = Executors.newSingleThreadExecutor();
    

    那么您的线程将全部按照提交执行的顺序进行调度和执行。在少数情况下这样做是合乎逻辑的,但在大多数情况下,线程不是用于解决此问题的错误工具。

    当您需要在不同的线程中执行任务时,这种事情是有意义的——也许执行需要很长时间并且您不想阻塞 GUI 线程——但您不想需要或不希望提交的任务同时运行。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        Thread pools 通常用于不需要synchronization 或高度parallel 的操作。

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

        我建议查看 Java concurrency lesson 以了解 Java 中的并发性。

        【讨论】:

          猜你喜欢
          • 2011-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-23
          相关资源
          最近更新 更多