好吧,我对标题感到抱歉。我真的不知道该怎么形容这句话。我会在这里做得更好。
所以,我有 2 个 Java 类。我们将它们称为 FirstClass 和 SecondClass (实现 Runnable)。在 FirstClass 中,我正在做一些事情,然后创建 4 个线程。
Thread t1 = new Thread (new SecondClass(s1));
Thread t2 = new Thread (new SecondClass(s2));
Thread t3 = new Thread (new SecondClass(s3));
Thread t4 = new Thread (new SecondClass(s4));
s1、s2、s3 和 s4 均为 String 类型并持有个人值(value)观。
然后我立即启动线程。
t1.start();
t2.start();
t3.start();
t4.start();
然后在我的 SecondClass 中,我在默认构造函数中获取这些字符串,如下所示
HashMap<String, Integer> map;
public SearchResults(String s) {
map.put(s, 0);
}
在 run() 方法中我正在执行以下操作
public void run() {
try {
System.out.println(map);
} catch (Exception e) {
// TODO: handle exception
}
}
所以这个无用程序的结果是 map 被打印了 4 次,有 4 个不同的值。
我想知道如何返回一个 map 实例,该实例包含 t1 放入其中的所有值以及 t2 放入其中的所有值> 放入其中等等。他们都在处理相同的变量,map,但每个线程似乎都做自己的事情。
我可以让线程执行,然后当它们全部完成时,将 map 返回到另一个类或其他东西吗?我真的对线程了解不多,所以这让我很困惑。任何帮助将不胜感激。
最佳答案
有多种方法可以做到这一点。更好的解决方案是切换并使用 ExecutorService
而不是自己 fork 线程。然后您可以实现 Callable<Map>
(而不是 Runnable
)在您的 SecondClass
中并返回每个作业创建的 map 。
类似于:
// create a thread pool with as many workers as there are jobs
ExecutorService threadPool = Executors.newCachedThreadPool();
List<Future<Map<String, Integer>>> futures =
new ArrayList<Future<Map<String, Integer>>>();
futures.add(threadPool.submit(new SecondClass(s1)));
futures.add(threadPool.submit(new SecondClass(s2)));
futures.add(threadPool.submit(new SecondClass(s3)));
futures.add(threadPool.submit(new SecondClass(s4)));
// once we have submitted all jobs to the thread pool, it should be shutdown
threadPool.shutdown();
...
Map<String, Integer> all = new HashMap<String, Integer>();
for (Future<Map<String, Integer>> future : futures) {
// future.get() throws an exception if your call method throws
all.putAll(future.get());
}
那么你的SecondClass
实现Callable
:
public Map<String, Integer> call() {
...
return map;
}
您可以使用的一些其他机制包括:
- 使用共享
ConcurrentHashMap
传入(更好)或static
(不太好) - 让您的线程将其结果放在
BlockingQueue
上当他们完成时 - 加入线程,然后调用类上的方法来获取
Map
就这样被创建了。
关于java - 如何返回已在 4 个不同线程中编辑过的变量的一个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15928141/