Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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,我正在编写的应用程序在特定阶段生成字符数组列表。在这个阶段,我尝试创建一个线程来处理这个ArrayList。问题是如何将此ArrayList传递给线程 描述代码: class thisApp { /* Some initial processing creates an ArrayList - aList */ Runnable proExec = new ProcessList (); //ProcessList implements Runnable Thread

我正在编写的应用程序在特定阶段生成字符数组列表。在这个阶段,我尝试创建一个线程来处理这个ArrayList。问题是如何将此ArrayList传递给线程

描述代码:

class thisApp {
    /* Some initial processing creates an ArrayList - aList */

    Runnable proExec = new ProcessList (); //ProcessList implements Runnable
    Thread th = new Thread(proExec);
}
ProcessList的描述性代码:

public class ProcessList implements Runnable {
    public void run() {
      /* Access the ArrayList - aList - and do something upon */
    }
}

我的问题是:如何在run()中传递和访问aList?

ProcessList
构造函数添加一个参数

public class ProcessList implements Runnable
{    
    private final List<Foo> aList;

    public ProcessList(List<Foo> aList)
    {
        this.aList = aList;
    }

    public void run()
    {
      System.out.println(aList.size());
    }
}
公共类ProcessList实现可运行
{    
私人最终名单;
公共进程列表(列表列表列表)
{
this.aList=aList;
}
公开募捐
{
System.out.println(aList.size());
}
}

如果有任何其他线程可以访问列表,您必须小心并发访问列表。

您只需将
aList
传递给
ProcessList
的构造函数,该构造函数可以保留引用,直到需要时为止:

class thisApp {
    /* Some initial processing creates an ArrayList - aList */

    Runnable proExec = new ProcessList (aList);
    Thread th = new Thread(proExec);
}

public class ProcessList implements Runnable {
    private final ArrayList<Character> aList;
    public ProcessList(ArrayList<Character> aList) {
      this.aList = aList;
    }
    public void run() {
      /* use this.aList */
    }
}
class thisApp{
/*一些初始处理会创建一个ArrayList-List*/
Runnable proExec=新进程列表(列表);
Thread th=新线程(proExec);
}
公共类ProcessList实现可运行{
私人终审法官;
公共进程列表(ArrayList){
this.aList=aList;
}
公开募捐{
/*用这个*/
}
}

N.B.如果多个线程同时访问
aList
,并且有一个或多个线程对其进行修改,则所有相关代码都需要
同步

您可以将列表设置为最终列表,但最好将其传递给您的可运行对象

public class ProcessList implements Runnable {
    List<Character> list;
    public ProcessList(List<Character> list){
    this.list = list;
    }
    public void run() {
         this.list.size();
    }
}
公共类ProcessList实现可运行{
名单;
公共进程列表(列表){
this.list=列表;
}
公开募捐{
this.list.size();
}
}

“您可以将列表设置为最终列表”-我不明白您在那里说的话。我的意思是,如果列表在范围内,那么通过将其设置为最终列表,您可以从threads run方法中引用它,而无需将其传入。同时访问列表的可能性很小。无论如何,谢谢!