并发遍历二叉树 Java 实现

本文介绍了一种使用多线程并发遍历二叉树的Java算法,不保证遍历顺序,但能确保节点被访问。关键点包括线程池任务分配、工作结束的判断以及线程池的关闭。程序运行结果显示效率显著提高。
摘要由CSDN通过智能技术生成
单线程遍历二叉树是数据结构书中必讲的算法, 但多线程访问呢?

我最近写了一个多线程遍历二叉树的算法, 当然既然是多线程,就不保证一定的顺序, 只要节点能访问到就算数.

算法的基本思路

1) 使用 java.util.concurrent.ThreadPoolExecutor 构造线程池

2) 当线程池有空余线程把树的右子树拆分给另外一个线程处理, 否则自己处理右子数

要考虑的情况

1) 如果二叉树非常不平衡(左子树很深,右子树很浅), 会出现一个线程忙碌,而另外一个线程早结束的情况
       工作线程过一定时间间隔就会检查线程池是否有空闲线程, 有则分离当前节点的右子树并委托给ThreadPool

2)判断所有工作都结束

      启动工作任务时用 HashSet 记录, 工作任务结束时清楚HashSet 记录, 当HashSet size 为0 时,所有工作结束.

注意事项

1) 即使任务结束,ThreadPool 还是在运行的( waiting task ), 要调用 shutdown 通知 ThreadPool 结束

2) 主线程结束, 程序并不会结束, 想让主线程等待 ThreadPool 结束, 要调用ThreadPool 的 awaitTermination 方法

程序

package com.pnp.javathreadpool;

import java.util.HashSet;
import java.util.Random;
import java.util.Stack;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ConcurTravBTree {
	class BTreeNode<T extends Comparable> {

		public BTreeNode<T> left;
		public BTreeNode<T> right;
		public T value;

		public BTreeNode(BTreeNode<T> left, BTreeNode<T> right, T value) {
			this.left = left;
			this.right = right;
			this.value = value;
		}

	
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值