并发遍历二叉树 (三)

2014-11-24 03:01:53 · 作者: · 浏览: 8

}
}
System.out.println("[ job" + id + " ] ---end");
tasks.remove(id);
if ( tasks.size() == 0) {
threadPool.shutdown();
}
}
}

public static void main(String[] args) {
ConcurTravBTree tt = new ConcurTravBTree();
System.out.println("init tree...");
tt.init();

System.out.println("start preOrderTraverse traverse...");
long start = System.currentTimeMillis();
tt.tree.preOrderTraverse();
long end = System.currentTimeMillis();
System.out.println("---- preOrderTraverse cost " + (end - start));

System.out.println("start concurrent traverse...");
long cstart = System.currentTimeMillis();
tt.start();
try {
tt.threadPool.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
long cend = System.currentTimeMillis();
System.out.println("---- current traverse cost " + (cend - cstart));
}
}

在程序中,我调用 Thread.sleep() 模拟处理时间, 否则启动线程池, 线程调度的开销将大于节点访问时间, 体现不出多线程的优势.

在i3上跑得的输出: 似乎效率提高了1倍
[cpp]
init tree...
start preOrderTraverse traverse...
---- preOrderTraverse cost 50023
start concurrent traverse...
[ job1 ] ---start
--- ActiveCount 1
[ job2 ] ---start
--- ActiveCount 2
[ job3 ] ---start
--- ActiveCount 3
[ job4 ] ---start
--- ActiveCount 4
[ job3 ] ---end
[ job5 ] ---start
--- ActiveCount 4
[ job5 ] ---end
[ job6 ] ---start
--- ActiveCount 4
[ job4 ] ---end
[ job7 ] ---start
[ job6 ] ---end
[ job7 ] ---end
[ job1 ] ---end
[ job2 ] ---end
---- current traverse cost 27116

init tree...
start preOrderTraverse traverse...
---- preOrderTraverse cost 50023
start concurrent traverse...
[ job1 ] ---start
--- ActiveCount 1
[ job2 ] ---start
--- ActiveCount 2
[ job3 ] ---start
--- ActiveCount 3
[ job4 ] ---start
--- ActiveCount 4
[ job3 ] ---end
[ job5 ] ---start
--- ActiveCount 4
[ job5 ] ---end
[ job6 ] ---start
--- ActiveCount 4
[ job4 ] ---end
[ job7 ] ---start
[ job6 ] ---end
[ job7 ] ---end
[ job1 ] ---end
[ job2 ] ---end
---- current traverse cost 27116

有时间把此程序放到4核的机器上跑, 看究竟效率能提高多少