java - java中通过传递参数实现多线程

标签 java multithreading

我正在从数据库中以 240 大小的 ArrayList 形式检索一些值,并从每个包含 8 个值的列表中创建一个子列表。我想对此子列表进行一些处理,该子列表将作为参数传递给线程。 我正在 for 循环中创建线程对象,在该循环中创建该子列表并将其传递给线程。但我面临的问题是我必须等到一个线程完成其工作,因为该参数在线程中是全局的并给出并发错误。 我如何才能不将其设为全局变量并在不等待 1 个线程完成的情况下对我的子列表进行处理,我想发送并行请求并处理此子列表。 请查看我正在编写的一些代码:

Class a {

    for(int j=0; j<240; j++) {

    subOrders.add(orders.get(j));
    if(subOrders.size()==8)
    {           
         TestThread test = new TestThread(subOrders);   
         try {
            test.t.join();
            } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            }
            subOrders.clear();
        }

    }
}

线程类:

public class TestThread implements Runnable {

    ArrayList<Integer> b ;
    public Thread t;
    public TestThread(ArrayList<Integer> a) {
        b=a;
        t= new Thread(this);
        t.start();  
    }


    @Override
    public void run() {
        ArrayList<Integer> c = b;

            System.out.println(c);
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }           




    }

最佳答案

这是将数据传递到线程的正常方式。请注意,此方法要求将变量声明为final。如果您不需要更改子列表,则获取子列表的第一种方法就很好。第二个可以修改,无需担心同步问题(任何修改都不会反射(reflect)在全局订单列表中)。

for (int i = 0; i < 240; i+=8) {
    // this sub list is backed by the orders list, so you should be careful
    // if you need to alter the sub list.
    final List<Integer> subList = orders.subList(i, i+8); 
    final List<Integer> subListThatAllowsLocalModifications =
            new ArrayList<Integer>(subList);
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println(subList);
        }
    });
    t.start();
}

关于java - java中通过传递参数实现多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9651006/

相关文章:

java - @PostConstruct 与 Jersey 1.17、Weblogic 一起使用

java - 添加到其他 JPanel 时 JPanel 不呈现

java - 如何放弃 LuaJ 协程 LuaThread?

android - 在不干扰android UI的情况下从服务器获取数据并将数据存储到数据库中的最佳方法是什么?

java - 在 Mac OS X 上更改 Java 的最大内存堆

java - 我们可以使用 Linq 从 java 中的集合对象中获取值吗?

java - 为什么 java.lang.Void 不可序列化?

java - 线程池,worker既是生产者又是消费者

javascript - 为什么这是 Node js 集群中的错误

c++ - 其他线程可以修改线程本地内存吗?