读书人

利用对象的等待队列跟锁队列管理线程

发布时间: 2012-11-12 12:31:58 作者: rapoo

利用对象的等待队列和锁队列管理线程。

假设,每个对象都有一个锁队列。来说明可以被多少个线程公用。

while(true){ {   if(线程要访问对象){     进队等待;   }  if(有锁,并且有等待的线程)     {      锁出锁队列; Thread.start();    进锁列;             Thread.end();   } }

?

1 楼 gembler 2009-02-21 请给出完整示例,不要伪代码。
说说实话,我还不懂你想说明什么。 2 楼 找不到服务器 2009-02-21 线程池的实现原理????? 3 楼 fjlyxx 2009-02-23 你应该用线程去监听队列,队列状态驱动线程工作.研究下LF线程模型 你这个问题就解决了.不过要注意队列中的节点应该有生命周期的不要让相同任务在队列中重复出现. 4 楼 daojin 2009-03-07 fjlyxx 写道你应该用线程去监听队列,队列状态驱动线程工作.研究下LF线程模型 你这个问题就解决了.不过要注意队列中的节点应该有生命周期的不要让相同任务在队列中重复出现.
:

你说的真高深,不太明白,线程池啦,LF线程模型啦,都没有听说过。

我写那些东西的目的呢,只是为了出于一种好奇。
从感觉上说,
java提供的一些多线程同步控制机制限制得太死板。
例如,无法控制访问同一对象的线程的数量,等问题。
所以,一个很简单的问题,
5个线程去抢一个资源,该如何协调?
因此,给了上面一个伪代码。
我想计算机底层也应该是这样实现的吧。

此外,谢谢楼上的关注,收益颇深。
5 楼 daojin 2009-03-07 gembler 写道请给出完整示例,不要伪代码。
说说实话,我还不懂你想说明什么。
其实我也不懂,我想说明什么,只是一些胡乱猜想,其目的就是解决一个多线程问题:
如果有10人同时去抢一个教室,而这个教室只有5个座位,该如何协调?
知识浅陋,望赐教。 6 楼 gembler 2009-03-07 daojin 写道gembler 写道请给出完整示例,不要伪代码。
说说实话,我还不懂你想说明什么。
其实我也不懂,我想说明什么,只是一些胡乱猜想,其目的就是解决一个多线程问题:
如果有10人同时去抢一个教室,而这个教室只有5个座位,该如何协调?
知识浅陋,望赐教。
不知道你想怎么样协调 7 楼 daojin 2009-03-08 gembler 写道daojin 写道gembler 写道请给出完整示例,不要伪代码。
说说实话,我还不懂你想说明什么。
其实我也不懂,我想说明什么,只是一些胡乱猜想,其目的就是解决一个多线程问题:
如果有10人同时去抢一个教室,而这个教室只有5个座位,该如何协调?
知识浅陋,望赐教。
不知道你想怎么样协调
让线程入个队列,而且这个队列是独占模式的。
只要把这个队列管理好,线程也就管理好了。
我是这么认为的,不知到对不对。 8 楼 fjlyxx 2009-03-10 daojin 写道fjlyxx 写道你应该用线程去监听队列,队列状态驱动线程工作.研究下LF线程模型 你这个问题就解决了.不过要注意队列中的节点应该有生命周期的不要让相同任务在队列中重复出现.
:

你说的真高深,不太明白,线程池啦,LF线程模型啦,都没有听说过。

我写那些东西的目的呢,只是为了出于一种好奇。
从感觉上说,
java提供的一些多线程同步控制机制限制得太死板。
例如,无法控制访问同一对象的线程的数量,等问题。
所以,一个很简单的问题,
5个线程去抢一个资源,该如何协调?
因此,给了上面一个伪代码。
我想计算机底层也应该是这样实现的吧。

此外,谢谢楼上的关注,收益颇深。

简单的说你不用锁队列,你把队列丢给一个线程,这个线程获取到队列节点后去找一个可以用的工作现场再把队列给它让它继续监听队列状态. 如果找不到可以用的工作现场就一直找.

原理就是这么简单,当前监听队列的线程是L线程 没有在监听队列的线程是F线程 因为只有一个线程能从队列中获取值所以不存在竞争的问题了.

9 楼 daojin 2009-03-13 fjlyxx 写道daojin 写道fjlyxx 写道你应该用线程去监听队列,队列状态驱动线程工作.研究下LF线程模型 你这个问题就解决了.不过要注意队列中的节点应该有生命周期的不要让相同任务在队列中重复出现.
:

你说的真高深,不太明白,线程池啦,LF线程模型啦,都没有听说过。

我写那些东西的目的呢,只是为了出于一种好奇。
从感觉上说,
java提供的一些多线程同步控制机制限制得太死板。
例如,无法控制访问同一对象的线程的数量,等问题。
所以,一个很简单的问题,
5个线程去抢一个资源,该如何协调?
因此,给了上面一个伪代码。
我想计算机底层也应该是这样实现的吧。

此外,谢谢楼上的关注,收益颇深。

简单的说你不用锁队列,你把队列丢给一个线程,这个线程获取到队列节点后去找一个可以用的工作现场再把队列给它让它继续监听队列状态. 如果找不到可以用的工作现场就一直找.

原理就是这么简单,当前监听队列的线程是L线程 没有在监听队列的线程是F线程 因为只有一个线程能从队列中获取值所以不存在竞争的问题了.


怎么感觉像是批发市场?

批发市场就相当于任务队列?

小商家就相当于L,F 线程.

如果小商家在等货,就是L;

如果在卖货,就是F;

而货物最终的买家就是您说的 工作现场?

10 楼 fjlyxx 2009-03-18 呵呵 楼上的你说的很形象.不过还是需要说下货这个东西和小商家以及批发市场间的运作关系. 毕竟这个批发市场不会出现同时有两个小商家在抢购同一个货的情况. 11 楼 daojin 2009-03-19 fjlyxx 写道
呵呵 楼上的你说的很形象.不过还是需要说下货这个东西和小商家以及批发市场间的运作关系. 毕竟这个批发市场不会出现同时有两个小商家在抢购同一个货的情况.

大体总结一下算法过程:
初始化任务队列对象taskObject;
taskObject.AddListener(taskThreadListener1);
taskObject.AddListener(taskThreadListener2);
taskObject.AddListener(taskThreadListener3);
taskObject.AddListener(taskThreadListener4);
...
其中监听过程这样构造:
while(true)
{
if(havaTask())
{
//利用任务来驱动线程工作。
switch(Task.id)
{
case TS1:
taskThreadListener1.doTask();
break;
case TS2:
taskThreadListener2.doTask();
break;
case TS3:
taskThreadListener3.doTask();
break;
}
}
//按照某种频率执行此过程。
Sleep(1);
}

在各个监听线程中,doTaks()这样构造:
void doTask()
{
//这个块必须是同步块。等于把任务仍给了这个线程。
synchronized(clock)
{
task=this.getTaskQune().popTask();
return;
}
}
taskThreadListener1.run()中这样写:

while(true)
{
//如果有任务:
if(task!=NULL)
{
work();
}
//没隔一段时间访问一次,是否有任务。
sleep(1);
}
算法结束。

终于写完了。。。




12 楼 daojin 2009-03-19 错了。上面代码写的有问题。。。。

读书人网 >软件架构设计

热点推荐