java多线程程序4
我在一次面试中被问到一个问题 问题如下: 任务使用主线程(此处未显示)在多个线程之间共享扫描DNA的工作。 *主线程一次调用所有其他线程上的Scanna方法(如下),每个线程 *线程提供了自己的工作私有共享(数据列表,每个线程单独使用)。java多线程程序4,java,multithreading,Java,Multithreading,我在一次面试中被问到一个问题 问题如下: 任务使用主线程(此处未显示)在多个线程之间共享扫描DNA的工作。 *主线程一次调用所有其他线程上的Scanna方法(如下),每个线程 *线程提供了自己的工作私有共享(数据列表,每个线程单独使用)。 * *每个线程共享公共“结果”对象,作为向主线程报告扫描进度的一种方式 *任务的线程。对于任务来说,成功扫描的总数是非常重要的 *总是准确的。 * *通过修改下面的Scanna方法并修复任何缺陷,提高任务的总体性能。 */ 私有接口DNA{ 公共布尔扫描(
* *每个线程共享公共“结果”对象,作为向主线程报告扫描进度的一种方式 *任务的线程。对于任务来说,成功扫描的总数是非常重要的 *总是准确的。 * *通过修改下面的Scanna方法并修复任何缺陷,提高任务的总体性能。 */
私有接口DNA{
公共布尔扫描();
}
公共空间扫描(列表数据列表、属性结果){
已同步(结果){
迭代器i=dnaList.Iterator();
对象锁=新对象();
while(i.hasNext()){
如果(i.next().scan()){
String key=“已执行成功的扫描”;
已同步(锁定){
results.setProperty(键,
String.valueOf(Integer.valueOf(results.getProperty(key))+1));
}
}
}
}
}
我无法理解这个问题,我真的非常感谢您通过
结果
对象进行同步来解决这个问题。在工作开始时,线程彼此等待,这是因为它们将同步而不是并行地完成工作。
由于每个线程的输入数据对于该线程来说是唯一的,因此它们应该首先计算结果(无需同步),如果结果可用,则使用结果周围的同步化
,并对其进行更新。所以锁变得尽可能短。
lock
对象本身似乎没有用,因为每个线程都为外观创建自己的变量。扫描的总计数如何准确?
private interface DNA {
public boolean scan();
}
public void scanDNA(List<DNA> dnaList, Properties results) {
synchronized (results) {
Iterator<DNA> i = dnaList.iterator();
Object lock = new Object();
while (i.hasNext()) {
if (i.next().scan()) {
String key = "Successful Scans Performed";
synchronized (lock) {
results.setProperty(key,
String.valueOf(Integer.valueOf(results.getProperty(key)) + 1));
}
}
}
}
}