0

如何在线程之间创建公共变量?例如:许多线程向服务器发送请求以创建用户。

这些用户保存在一个 中ArrayList,但ArrayList必须为所有线程同步。我该怎么做 ?

谢谢大家!

4

3 回答 3

4

如果要从多个线程访问列表,可以使用 Collections 来包装它:

List<String> users = Collections.synchronizedList(new ArrayList<String>());

然后只需将它在构造函数中传递给将使用它的线程。

于 2013-09-09T13:59:47.700 回答
2

我会使用一个ExecutorService并提交你想要执行的任务。这样你就不需要同步集合(可能根本不需要集合)

但是,您可以通过创建一个用 a 包裹的 ArrayList 来执行您的建议,Collections.synchronizedList()并在启动它之前将其作为对线程的引用。

你可以做的是

// can be reused for other background tasks.
ExecutorService executor = Executors.newFixedThreadPool(numThreads);

List<Future<User>> userFutures = new ArrayList<>();
for( users to create )
   userFutures.add(executor.submit(new Callable<User>() {
        public User call() {
            return created user;
        }
   });
List<User> users = new ArrayList<>();
for(Future<User> userFuture: userFutures)
   users.add(userFuture.get();
于 2013-09-09T14:00:36.707 回答
1

要扩展@Peter的答案,如果您使用 anExecutorService您可以提交一个Callable<User>可以返回User由在另一个线程中运行的任务创建的。

就像是:

// create a thread pool with 10 background threads
ExecutorService threadPool = Executors.newFixedThreadPool(10);
List<Future<User>> futures = new ArrayList<Future<User>>();
for (String userName : userNamesToCreateCollection) {
    futures.add(threadPool.submit(new MyCallable(userName)));
}
// once you submit all of the jobs, we shutdown the pool, current jobs still run
threadPool.shutdown();

// now we wait for the produced users
List<User> users = new ArrayList<User>();
for (Future<User> future : futures) {
    // this waits for the job to complete and gets the User created
    // it also throws some exceptions that need to be caught/logged
    users.add(future.get());
}
...

private static class MyCallable implements Callable<User> {
    private String userName;
    public MyCallable(String userName) {
        this.userName = userName;
    }
    public User call() {
        // create the user...
        return user;
    }
}
于 2013-09-09T14:29:56.520 回答