Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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中的重复输出_Java_Multithreading - Fatal编程技术网

多线程java中的重复输出

多线程java中的重复输出,java,multithreading,Java,Multithreading,我是多线程编程新手。代码不符合我的要求: public class Test { static int i; public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(10); for(i = 0; i<10 ;i++) { executor.execute(new Runnable

我是多线程编程新手。代码不符合我的要求:

public class Test {
    static int i;
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(10);
        for(i = 0; i<10 ;i++) {
             executor.execute(new Runnable() {
                 public void run () {
                     System.out.println(i);
                 }
            });
        }
    }
}
公共类测试{
静态int-i;
公共静态void main(字符串[]args){
ExecutorService executor=Executors.newFixedThreadPool(10);

对于(i=0;i不将静态
i
传递给
run

public class Test {
    public static void main(String[] args) {
    ExecutorService executor = Executors.newFixedThreadPool(10);
    for(int i = 0; i < 10 ;i++){
         int x = i;
         executor.execute(new Runnable(){
         public void run (){
             System.out.println(x);
         }
     });
    }    
    }
}
公共类测试{
公共静态void main(字符串[]args){
ExecutorService executor=Executors.newFixedThreadPool(10);
对于(int i=0;i<10;i++){
int x=i;
executor.execute(新的Runnable(){
公开作废运行(){
系统输出println(x);
}
});
}    
}
}

您可以拥有一个实现
可运行的类,并使用构造函数将静态字段复制到实例字段中:

executor.execute(new MyRunnable(i));


class MyRunnable implements Runnable {
     int i;

     public MyRunnable(int i) {
         this.i = i;
     }

     // run method
 }

这保证了每个线程在
for
循环中都有自己的唯一整数,其顺序与
i
的顺序完全相同。

感谢您的评论,一旦我删除了i,runnable就看不到我了。抱歉,我失败了。更新了答案。您正在打印线程运行时发生的
i
。我很惊讶这不仅仅是
10
每次线程都需要一些时间才能启动。感谢您的回复,我只是想知道有什么更好的方法可以做到这一点,您的答案或ka4eli的答案我认为两者归结为几乎相同的编译代码,因此具有相同的性能。如果我没有错的话,另一个答案需要Java 8编译。