Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.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

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 为什么synchronizedList不能正常工作_Java_Multithreading_Arraylist_Synchronize - Fatal编程技术网

Java 为什么synchronizedList不能正常工作

Java 为什么synchronizedList不能正常工作,java,multithreading,arraylist,synchronize,Java,Multithreading,Arraylist,Synchronize,我使用synchronizedList()编写了以下代码: /* *要更改此许可证标题,请在“项目属性”中选择“许可证标题”。 *要更改此模板文件,请选择工具|模板 *然后在编辑器中打开模板。 */ 包装收集演示; 导入java.util.*; 类ThreadTest实现可运行 { 螺纹t; 私有int-var; 公共线程测试(int-var) { t=新螺纹(本螺纹); this.var=var; t、 start(); } @凌驾 公开募捐 { 系统输出打印项次(var); } } 公共类集

我使用synchronizedList()编写了以下代码:

/*
*要更改此许可证标题,请在“项目属性”中选择“许可证标题”。
*要更改此模板文件,请选择工具|模板
*然后在编辑器中打开模板。
*/
包装收集演示;
导入java.util.*;
类ThreadTest实现可运行
{
螺纹t;
私有int-var;
公共线程测试(int-var)
{
t=新螺纹(本螺纹);
this.var=var;
t、 start();
}
@凌驾
公开募捐
{
系统输出打印项次(var);
}
}
公共类集合演示{
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args)引发InterruptedException{
List synlist=Collections.synchronizedList(新的ArrayList());
添加(新螺纹测试(1));
添加(新螺纹测试(2));
添加(新螺纹测试(3));
添加(新螺纹测试(4));
添加(新螺纹测试(5));
对于(int i=0;i<5;i++){
synlist.get(i.t.join();
}
//System.out.println(“Sunchronized list为:“+list”);
}
}

现在,我得到的输出顺序仍然不正确。他们每次来的顺序都不一样。现在该怎么办?如何正确使用synchronizedList()方法?

因为您要在synchronizedList中添加threadtest对象,所以所有对象都会按插入顺序添加到列表中,因为它是一个列表,而且因为它是synchronizedList,所以它为您提供了额外的线程安全功能

当您执行程序时,它会以不同的顺序打印数字,因为该数字是由treadtest类(一个线程)生成的,您无法以这种方式控制线程的执行顺序

但是为了确保添加的对象是自然顺序的,您可以在ThreadTest类中添加getVar()方法,并在列表中循环并打印var值,您可以看到它的顺序是相同的

        class ThreadTest implements Runnable
        {
            Thread t;
            private int var;

            public ThreadTest(int var)
            {
                t = new Thread(this);
                this.var = var;
                t.start();
            }

            @Override
            public void run()
            {
                System.out.println(var);
            }

            public int getVar(){
                return var;
            }
}


            public class CollectionsDemo {
                 /**
                 * @param args the command line arguments
                 */
                public static void main(String[] args) throws InterruptedException {
                    List<ThreadTest> synlist = Collections.synchronizedList(new ArrayList<>());
                    synlist.add(new ThreadTest(1));
                    synlist.add(new ThreadTest(2));
                    synlist.add(new ThreadTest(3));
                    synlist.add(new ThreadTest(4));
                    synlist.add(new ThreadTest(5));
                    for (int i = 0; i < 5; i++) {
                        synlist.get(i).t.join();
                    }

                    for(ThreadTest test :synlist){
                        System.out.println(test.getVar());
                    }
            //        System.out.println("Sunchronized list is :"+synlist);
                }

            }
class ThreadTest实现可运行
{
螺纹t;
私有int-var;
公共线程测试(int-var)
{
t=新螺纹(本螺纹);
this.var=var;
t、 start();
}
@凌驾
公开募捐
{
系统输出打印项次(var);
}
公共int getVar(){
收益var;
}
}
公共类集合演示{
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args)引发InterruptedException{
List synlist=Collections.synchronizedList(新的ArrayList());
添加(新螺纹测试(1));
添加(新螺纹测试(2));
添加(新螺纹测试(3));
添加(新螺纹测试(4));
添加(新螺纹测试(5));
对于(int i=0;i<5;i++){
synlist.get(i.t.join();
}
用于(ThreadTest测试:synlist){
System.out.println(test.getVar());
}
//System.out.println(“同步化列表为:“+synlist”);
}
}

您想要什么样的订单?为什么?再次阅读
集合.synchronizedList
规范。您将发现它与启动线程的顺序无关(但只提供线程安全操作),线程的整个要点是并行执行。为什么您希望它们以任何特定的顺序运行?另一件事,join()方法呢?我上面的代码能保证在所有线程都死后,主线程会再次开始执行吗?这对我来说也很重要,知道吗?
        class ThreadTest implements Runnable
        {
            Thread t;
            private int var;

            public ThreadTest(int var)
            {
                t = new Thread(this);
                this.var = var;
                t.start();
            }

            @Override
            public void run()
            {
                System.out.println(var);
            }

            public int getVar(){
                return var;
            }
}


            public class CollectionsDemo {
                 /**
                 * @param args the command line arguments
                 */
                public static void main(String[] args) throws InterruptedException {
                    List<ThreadTest> synlist = Collections.synchronizedList(new ArrayList<>());
                    synlist.add(new ThreadTest(1));
                    synlist.add(new ThreadTest(2));
                    synlist.add(new ThreadTest(3));
                    synlist.add(new ThreadTest(4));
                    synlist.add(new ThreadTest(5));
                    for (int i = 0; i < 5; i++) {
                        synlist.get(i).t.join();
                    }

                    for(ThreadTest test :synlist){
                        System.out.println(test.getVar());
                    }
            //        System.out.println("Sunchronized list is :"+synlist);
                }

            }