一道面试题 关于多线程的 请大家给个解决方案

careercup163 2013-03-08 10:57:37
就是实现一个 资源连接池(资源可以用一个泛型R 表示 无所谓),连接池里有很多资源可以使用, 一个线程同一时间只能使用一个资源, 释放以后才可以让其他线程使用。 必须实现以下几个方法
void open()
- 打开连接池
boolean isOpen()
- 判断连接池是否打开
void close()
- 关闭连接池
--所有以下操作连接池必须打开, 如果连接池关闭 则堵塞线程 直到连接池打开(可以实现一个时间t 如果超时 就抛出异常)
boolean add(R resource)
- 添加资源进入连接池(新添加的资源处于未使用状态)
boolean remove(R resource)
- 从连接池去掉某个资源, 必须等待这个资源使用完毕, 如果当前资源被其他线程使用中 就堵塞(block)这个线程,等待那个资源使用完毕 再删除
R acquire(long t)
- 获得连接池中一个资源的控制权, 如果连接池所有资源都在使用, 也堵塞当前这个线程,一直到连接池有未分配的资源(t是个超时的时间,如果t时间内仍然找不到可用连接池 就返回个null或者抛出异常)
void release(R resource)
- 停止使用一个资源。。。当前这个资源处于未使用状态


我当时是这么写的 在类中 定义了1个 bool isOpen来确定连接池是否打开, 有定义了一个哈希表dictionary<R,bool> pool定义一个资源R是否占用
每次操作都要lock(isOpen) 来判断是否打开 如果关闭 就是Monitor.Wait(isOpen)
在open方法里 也是要lock(isOpen), 然后将isOPen设置true 后Monitor.Pulse(isOpen)来唤醒其他Wait的线程
操作哈希表也用了同样的道理 先Lock(isOpen) 再嵌套lock(pool) 里头有Monitor.Wait(pool)也有Monitor.Wait(isOpen)
反正面试官觉得我答案不好 可能我哪里弄错了 大家有啥好方法没
...全文
185 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
careercup163 2013-03-11
  • 打赏
  • 举报
回复
有人会么
careercup163 2013-03-09
  • 打赏
  • 举报
回复
引用 1 楼 xboxeer 的回复:
很有意思的题目 感觉又空闲资源的时候应该用委托通知等待线程
我当时就是用Monitor.Pulse 通知的 请问委托如何通知哈 (另外语言不限 如果用java就没法用委托了吧)
xboxeer 2013-03-08
  • 打赏
  • 举报
回复
很有意思的题目 感觉又空闲资源的时候应该用委托通知等待线程

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧