`
daojin
  • 浏览: 691577 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

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

阅读更多

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

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

 

分享到:
评论
12 楼 daojin 2009-03-19  
错了。上面代码写的有问题。。。。
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);
}
算法结束。

终于写完了。。。




10 楼 fjlyxx 2009-03-18  
呵呵 楼上的你说的很形象.不过还是需要说下货这个东西和小商家以及批发市场间的运作关系. 毕竟这个批发市场不会出现同时有两个小商家在抢购同一个货的情况.
9 楼 daojin 2009-03-13  
fjlyxx 写道
daojin 写道
fjlyxx 写道
你应该用线程去监听队列,队列状态驱动线程工作.研究下LF线程模型 你这个问题就解决了.不过要注意队列中的节点应该有生命周期的不要让相同任务在队列中重复出现.

:

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

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

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

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

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


怎么感觉像是批发市场?

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

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

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

如果在卖货,就是F;

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

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

:

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

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

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

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

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

7 楼 daojin 2009-03-08  
gembler 写道
daojin 写道
gembler 写道
请给出完整示例,不要伪代码。
说说实话,我还不懂你想说明什么。

其实我也不懂,我想说明什么,只是一些胡乱猜想,其目的就是解决一个多线程问题:
如果有10人同时去抢一个教室,而这个教室只有5个座位,该如何协调
知识浅陋,望赐教。

不知道你想怎么样协调

让线程入个队列,而且这个队列是独占模式的。
只要把这个队列管理好,线程也就管理好了。
我是这么认为的,不知到对不对。
6 楼 gembler 2009-03-07  
daojin 写道
gembler 写道
请给出完整示例,不要伪代码。
说说实话,我还不懂你想说明什么。

其实我也不懂,我想说明什么,只是一些胡乱猜想,其目的就是解决一个多线程问题:
如果有10人同时去抢一个教室,而这个教室只有5个座位,该如何协调
知识浅陋,望赐教。

不知道你想怎么样协调
5 楼 daojin 2009-03-07  
gembler 写道
请给出完整示例,不要伪代码。
说说实话,我还不懂你想说明什么。

其实我也不懂,我想说明什么,只是一些胡乱猜想,其目的就是解决一个多线程问题:
如果有10人同时去抢一个教室,而这个教室只有5个座位,该如何协调?
知识浅陋,望赐教。
4 楼 daojin 2009-03-07  
fjlyxx 写道
你应该用线程去监听队列,队列状态驱动线程工作.研究下LF线程模型 你这个问题就解决了.不过要注意队列中的节点应该有生命周期的不要让相同任务在队列中重复出现.

:

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

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

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

相关推荐

    多线程 队列利用

    这样可以防止资源浪费,线程可以根据队列的状态自动进行等待和唤醒。 3. **并发容器**:Java的`java.util.concurrent`包提供了多种并发队列,如`ArrayBlockingQueue`、`LinkedBlockingQueue`和`...

    C++基于消息队列的多线程实现示例代码

    lock_guard 对象通常用于管理某个锁(Lock)对象,因此与 Mutex RAII 相关,方便线程对互斥量上锁,即在某个 lock_guard 对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而 lock_guard 的生命周期结束之后,...

    支持多线程和泛型的阻塞队列

    阻塞队列是一种在多线程编程中广泛使用的并发数据结构,它在计算机科学和编程领域,特别是Java和C++等面向对象语言中扮演着重要角色。标题中的“支持多线程和泛型的阻塞队列”意味着我们讨论的是一个能够同时处理多...

    多线程与循环队列

    在计算机科学中,多线程和循环队列是两个重要的概念,它们在高效并发编程中发挥着关键作用。本文将详细探讨多线程环境下的循环队列应用。 首先,我们来理解多线程。多线程是一种编程模型,允许一个程序同时执行多个...

    workquere工作队列 多线程

    9. **线程间通信**:`Monitor.Pulse`和`Monitor.Wait`可以用于线程间的同步和通信,使得一个线程可以在等待队列中有新任务时被唤醒。 10. **设计模式**:生产者消费者模式在这里非常适用,生产者(通常是用户界面或...

    java 多线程 队列工厂

    队列工厂则是实现多线程间通信和任务调度的一种设计模式,它提供了一种抽象和统一的方式来创建和管理队列实例。 ### 1. Java 多线程 多线程是指在单个程序中同时执行多个线程(任务)的能力。Java通过`Thread`类和...

    多线程队列源代码

    在IT行业中,多线程和队列是两个重要的概念,它们在系统设计和优化中扮演着关键角色。这里我们讨论的"多线程队列源代码"是一个实现了多线程和队列数据结构的程序,它包含了一个多线程队列的实现以及对应的测试程序。...

    C#队列Queue多线程用法实例

    队列在多线程环境下常常用于任务调度、消息传递等场景,因为它们能有效地管理和同步数据访问。本实例将详细讲解如何在多线程中使用C#的Queue类。 首先,我们创建一个队列实例,通过`new Queue()`来指定存储的数据...

    多线程队列

    在IT领域,多线程和线程池是提高系统并发性能和资源管理的重要技术。本文将深入探讨如何在C语言中实现多线程队列及其相关的知识点。 首先,多线程是指在一个进程中创建多个执行线程,每个线程可以并发执行不同的...

    多线程任务队列

    总之,多线程任务队列是并发编程中的重要工具,通过合理的同步和调度策略,可以有效利用多核处理器资源,提高软件的并发处理能力和响应速度。在C++中实现这样的队列,需要掌握线程同步、线程池和合适的数据结构等...

    多线程操作日志队列

    这种模式利用了多线程技术,通过队列作为数据结构来协调生产者(日志生成者)和消费者(日志处理器)之间的交互,确保数据的安全性和一致性。 1. **多线程**:多线程是现代计算机系统中并发执行任务的基本方式。在...

    MFC的多线程队列程序源代码

    源代码的分析可以帮助我们更好地理解如何在MFC环境中实现多线程队列,以及如何有效地管理和同步线程。通过这个示例,开发者可以学习到如何在实际项目中利用多线程技术优化程序性能,同时保证程序的稳定性和安全性。

    linux 等待队列

    6. **多线程与中断上下文**:等待队列也适用于多线程环境,当一个线程需要等待另一个线程完成特定任务时,可以利用等待队列进行同步。同时,等待队列也能在中断上下文中使用,确保中断处理程序能及时唤醒等待的进程...

    队列加多线程的例子

    综上所述,"队列加多线程的例子"是一个典型的并发编程实践,通过队列管理和多线程的结合,能够有效地调度和执行大量任务,提高程序的并发能力和响应速度。这个例子对于理解和掌握并发编程技巧,以及在实际项目中应用...

    java多线程加队列上传文件_后台处理

    通过以上分析可以看出,Java多线程加队列上传文件的实现不仅涉及基础的网络编程和文件操作知识,还需要掌握高级的多线程管理和并发控制技术。这种技术方案适用于需要高效处理大量文件上传请求的场景,比如云存储服务...

    Linux下使用EPoll+队列+多线程的C++实现

    在C++实现中,可能会使用`std::thread`库来创建和管理线程,使用`std::queue`作为请求队列的数据结构,使用互斥锁(`std::mutex`)和条件变量(`std::condition_variable`)来保证队列操作的线程安全。线程池会定期...

    易语言简单的多线程消息队列

    易语言简单的多线程消息队列。@Patek。

    C++实现线程安全队列

    在多线程编程中,线程安全是至关重要的一个概念,它...通过这样的实现和测试,我们可以确保在多线程环境中,C++的线程安全队列能够正确地工作,避免了数据竞争和不一致性问题。这对于构建并发应用程序是非常关键的。

Global site tag (gtag.js) - Google Analytics