Java线程教程类型问题

Java线程教程类型问题,java,multithreading,concurrency,threadpool,Java,Multithreading,Concurrency,Threadpool,谈到Java线程和并发性,我相当天真。我目前正在努力学习。我举了一个简单的例子,试图弄清楚并发是如何工作的 这是我的密码: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadedService { private ExecutorService exec; /** * @param delegate

谈到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);
        }
    }

}
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
公共类线程服务{
私人遗嘱执行人;
/**
*@param委托
*@param池大小
*/
公共线程服务(int池大小){
如果(池大小<1){
this.exec=Executors.newCachedThreadPool();
}否则{
this.exec=Executors.newFixedThreadPool(池大小);
}
}
公共空添加(最终字符串str){
exec.execute(新的Runnable(){
公开募捐{
系统输出打印项次(str);
}
});
}
公共静态void main(字符串参数[]){
ThreadedService t=新的ThreadedService(25);
对于(int i=0;i<100;i++){
t、 添加(“添加:”+i);
}
}
}
我需要做什么才能使代码按顺序打印出数字0-99?

通常用于不需要或高度复杂的操作

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


我建议看一下,了解一下Java中的并发性。

解决问题的最简单方法是使用1的线程池大小。然而,这并不是一个真正可以用线程来解决的问题

若要展开,请使用以下内容创建执行者:

this.exec = Executors.newSingleThreadExecutor();
然后,所有线程都将按照提交执行的顺序进行调度和执行。在一些情况下,这是一件合乎逻辑的事情,但在大多数情况下,线程是解决此问题的错误工具


当您需要在不同的线程中执行任务时,这样做是有意义的——可能执行任务需要很长时间,而且您不想阻止GUI线程——但您不需要或不希望提交的任务同时运行。

线程的思想是不按顺序执行任务


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

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

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

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

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

这不是练习的重点。。我提供的示例不是我真正要使用的。。我想更好地理解线程和同步。