Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Executor Framrwork的线程池_Java_Executorservice_Threadpoolexecutor - Fatal编程技术网

Java 使用Executor Framrwork的线程池

Java 使用Executor Framrwork的线程池,java,executorservice,threadpoolexecutor,Java,Executorservice,Threadpoolexecutor,我正在使用executor框架创建Fadder对象的多个实例并打印结果。我正在尝试学习如何使用多线程来更快地完成任务。我遇到的问题是,每次运行程序时,数字都以随机顺序打印。我认为为循环的每次迭代创建一个新对象可以解决这个问题,但它仍然以“随机”顺序打印数字。我有没有办法保证线程按其运行顺序打印?比如1,2,3,4,5。谢谢 package fadder; import java.util.concurrent.ExecutorService; import java.util.concurren

我正在使用executor框架创建Fadder对象的多个实例并打印结果。我正在尝试学习如何使用多线程来更快地完成任务。我遇到的问题是,每次运行程序时,数字都以随机顺序打印。我认为为循环的每次迭代创建一个新对象可以解决这个问题,但它仍然以“随机”顺序打印数字。我有没有办法保证线程按其运行顺序打印?比如1,2,3,4,5。谢谢

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

public class Fadder {
    private final int n;
    Fadder(int n){
        //initialize Fadder
        this.n = n;
    }
    Fadder add(int m){
        //create new Fadder
        return new Fadder(n+m);
    }
public static void main(String[] args) {
     int threadnum = Runtime.getRuntime().availableProcessors();
        ExecutorService executor = Executors.newFixedThreadPool(threadnum);
        Fadder MyAdder = new Fadder(1);
        for (int i = 0; i < 5; i+=1 ) {
            int index = i;
            //lambda function to print Fadder
        executor.submit(() -> {
                    System.out.println(String.valueOf(MyAdder.add(index)));
                });
    }
    executor.shutdown();
}
}
packagefadder;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
公共类音量控制器{
私人终审法院;
音量控制器(int n){
//初始化音量控制器
这个,n=n;
}
音量控制器添加(整数m){
//创建新的音量控制器
返回新的音量控制器(n+m);
}
公共静态void main(字符串[]args){
int threadnum=Runtime.getRuntime().availableProcessors();
ExecutorService executor=Executors.newFixedThreadPool(threadnum);
音量控制器MyAdder=新音量控制器(1);
对于(int i=0;i<5;i+=1){
int指数=i;
//用于打印音量控制器的lambda函数
执行人提交(()->{
System.out.println(String.valueOf(MyAdder.add(index));
});
}
executor.shutdown();
}
}

您无法保证许多线程处理代码的顺序。 但是,将平行流,你可以。见下文:

Stream<Integer> stream = Stream.iterate(1, i->i+1).limit(5) ;
      stream.parallel().forEachOrdered(System.out::println);
Stream=Stream.iterate(1,i->i+1).limit(5);
stream.parallel().forEachOrdered(System.out::println);

Yes:将第一行更改为
int-threadnum=1-老实说,请仔细阅读线程-关键是它们可以并行地做事情,每个都以自己的速度进行。若要按顺序打印数字,则不应使用线程。为此使用线程并不能加快速度。如果计算数字需要很多时间,那么线程就有意义了,您可以在单独的线程中进行计算,将所有结果收集到一个集合中,然后对它们进行排序。Fadder没有
toString
方法,您如何知道它们的运行顺序?感谢Erwin,我知道threadnum=1,但这只是一种测试,看看我是否能让它以我想要的方式为一个更大的程序工作。@immibis我有一个toString方法,但它被String.valueOf函数冗余。@Art String.valueOf调用对象的toString函数