`
liudaoru
  • 浏览: 1578589 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多线程任务调度学习

    博客分类:
  • java
阅读更多

昨天找到一套多线程任务调度的代码,相当的不错,先把思路总结一下。

 

首先需要有一个任务管理器来管理所有的任务,任务管理器提供添加新任务的接口。

 

然后需要有一个线程池管理器管理所有的线程,线程分三种状态:创建、运行、空闲三种状态,线程可以执行任务Task。

 

主流程通过一个TaskMonitorThread 的任务调度线程来调度任务,方法就是每次从任务队列中获取一个任务,然后再从线程池中取一个线程来执行。

 

另外还有一个TaskTimeOutThread 的任务超时监控线程来监控任务是否超时,这个需要一个存储运行时间的类来支撑。

 

一个线程在开始执行时会触发开始运行的事件,在结束时会触发运行结束的事件,这些事件会将线程重新调整为空闲状态,扔回线程池。

 

学习的代码是:http://www.iteye.com/topic/487152

分享到:
评论
2 楼 yyh123456 2012-07-13  
不错,真有用阿,这为这事而来
1 楼 liudaoru 2010-06-23  
Amobe里的一个Queue类,贴出来学习一下。。。

/*

 * 	This program is free software; you can redistribute it and/or modify it under the terms of 

 * the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, 

 * or (at your option) any later version. 

 * 

 * 	This program is distributed in the hope that it will be useful, 

 * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  

 * See the GNU General Public License for more details. 

 * 	You should have received a copy of the GNU General Public License along with this program; 

 * if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

 */

package com.meidusa.amoeba.util;

/**
 * A queue implementation that is more efficient than a wrapper around
 * java.util.Vector. Allows adding and removing elements to/from the beginning,
 * without the unneccessary System.arraycopy overhead of java.util.Vector.
 */
public class Queue<T> {
	public Queue(int suggestedSize) {
		_size = _suggestedSize = suggestedSize;
		_items = newArray(_size);
	}

	public Queue() {
		this(4);
	}

	public synchronized void clear() {
		_count = _start = _end = 0;
		_size = _suggestedSize;
		_items = newArray(_size);
	}

	public synchronized boolean hasElements() {
		return (_count != 0);
	}

	public synchronized int size() {
		return _count;
	}

	public synchronized void prepend(T item) {
		if (_count == _size) {
			makeMoreRoom();
		}

		if (_start == 0) {
			_start = _size - 1;
		} else {
			_start--;
		}

		_items[_start] = item;
		_count++;

		if (_count == 1) {
			notify();
		}
	}

	/**
	 * Appends the supplied item to the end of the queue, and notify a consumer
	 * if and only if the queue was previously empty.
	 */
	public synchronized void append(T item) {
		// only notify if the queue was previously empty
		append0(item, _count == 0);
	}

	/**
	 * Appends an item to the queue without notifying anyone. Useful for
	 * appending a bunch of items and then waking up the listener.
	 */
	public synchronized void appendSilent(T item) {
		append0(item, false);
	}

	/**
	 * Appends an item to the queue and notify a listener regardless of how many
	 * items are on the queue. Use this for the last item you append to a queue
	 * in a batch via <code>appendSilent</code> because the regular
	 * <code>append</code> will think it doesn't need to notify anyone because
	 * the queue size isn't zero prior to this add. You should also use this
	 * method if you have mutiple consumers listening waiting on the queue, to
	 * guarantee that one will be woken for every element added.
	 */
	public synchronized void appendLoud(T item) {
		append0(item, true);
	}

	/**
	 * Internal append method. If subclassing queue, be sure to call this method
	 * from inside a synchronized block.
	 */
	protected void append0(T item, boolean notify) {
		if (_count == _size) {
			makeMoreRoom();
		}
		_items[_end] = item;
		_end = (_end + 1) % _size;
		_count++;

		if (notify) {
			notify();
		}
	}

	/**
	 * Returns the next item on the queue or null if the queue is empty. This
	 * method will not block waiting for an item to be added to the queue.
	 */
	public synchronized T getNonBlocking() {
		if (_count == 0) {
			return null;
		}

		// pull the object off, and clear our reference to it
		T retval = _items[_start];
		_items[_start] = null;

		_start = (_start + 1) % _size;
		_count--;

		return retval;
	}

	/**
	 * Blocks the current thread waiting for an item to be added to the queue.
	 * If the queue is currently non-empty, this function will return
	 * immediately.
	 */
	public synchronized void waitForItem() {
		while (_count == 0) {
			try {
				wait();
			} catch (InterruptedException e) {
			}
		}
	}

	/**
	 * Gets the next item from the queue blocking for no longer than
	 * <code>maxwait</code> milliseconds waiting for an item to be added to
	 * the queue if it is empty at the time of invocation.
	 */
	public synchronized T get(long maxwait) {
		if (_count == 0) {
			try {
				wait(maxwait);
			} catch (InterruptedException e) {
			}

			// if count's still null when we pull out, we waited
			// ourmaxwait time.
			if (_count == 0) {
				return null;
			}
		}

		return get();
	}

	/**
	 * Gets the next item from the queue, blocking until an item is added to the
	 * queue if the queue is empty at time of invocation.
	 */
	public synchronized T get() {
		while (_count == 0) {
			try {
				wait();
			} catch (InterruptedException e) {
			}
		}

		// pull the object off, and clear our reference to it
		T retval = _items[_start];
		_items[_start] = null;

		_start = (_start + 1) % _size;
		_count--;

		// if we are only filling 1/8th of the space, shrink by half
		if ((_size > MIN_SHRINK_SIZE) && (_size > _suggestedSize)
				&& (_count < (_size >> 3)))
			shrink();

		return retval;
	}

	private void makeMoreRoom() {
		T[] items = newArray(_size * 2);
		System.arraycopy(_items, _start, items, 0, _size - _start);
		System.arraycopy(_items, 0, items, _size - _start, _end);
		_start = 0;
		_end = _size;
		_size *= 2;
		_items = items;
	}

	// shrink by half
	private void shrink() {
		T[] items = newArray(_size / 2);

		if (_start > _end) {
			// the data wraps around
			System.arraycopy(_items, _start, items, 0, _size - _start);
			System.arraycopy(_items, 0, items, _size - _start, _end + 1);

		} else {
			// the data does not wrap around
			System.arraycopy(_items, _start, items, 0, _end - _start + 1);
		}

		_size = _size / 2;
		_start = 0;
		_end = _count;
		_items = items;
	}

	@SuppressWarnings("unchecked")
	private T[] newArray(int size) {
		return (T[]) new Object[size];
	}

	public String toString() {
		StringBuilder buf = new StringBuilder();

		buf.append("[count=").append(_count);
		buf.append(", size=").append(_size);
		buf.append(", start=").append(_start);
		buf.append(", end=").append(_end);
		buf.append(", elements={");

		for (int i = 0; i < _count; i++) {
			int pos = (i + _start) % _size;
			if (i > 0)
				buf.append(", ");
			buf.append(_items[pos]);
		}

		return buf.append("}]").toString();
	}

	protected final static int MIN_SHRINK_SIZE = 1024;

	protected T[] _items;
	protected int _count = 0;
	protected int _start = 0, _end = 0;
	protected int _suggestedSize, _size = 0;
}

相关推荐

    基于java swing的多线程电梯调度模拟

    在本项目"基于Java Swing的多线程电梯调度模拟"中,我们主要探讨的是如何利用Java的多线程特性来实现一个复杂的系统——电梯调度。这个任务是在操作系统课程中的一个典型作业,它要求开发者模拟真实世界中的电梯运行...

    linux下 多线程模拟进程调度多线程模拟进程调度

    在Linux操作系统中,多线程模拟进程调度是一个深入理解操作系统内核和并发编程的重要主题。进程调度是操作系统核心的关键组成部分,负责决定哪个进程应该获得CPU的执行权,以及何时进行切换。而通过多线程模拟进程...

    纯C++实现的服务库,可以实现多任务多线程调度、执行

    总结来说,这个纯C++实现的服务库提供了一种简洁的多线程、多任务调度解决方案。它的设计和实现考虑到了并发执行、任务调度和资源管理等多个方面,对于理解和实践C++的并发编程具有很高的学习价值。开发者可以根据...

    简单多线程多任务的学习

    在编程领域,多线程和多任务处理是提高应用程序效率和响应速度的重要技术。这篇教程主要面向初学者,旨在帮助他们理解并掌握...通过逐步学习和实践,初学者将能够熟练地运用多线程技术,解决复杂的问题,提高程序性能。

    基于windows的多任务调度代码.rar_windows多任务_任务 调度 C++_任务调度_多任务_多任务调度

    总之,"基于Windows的多任务调度代码"是一个学习和实践多任务调度的好材料,对于提升C++程序员在系统编程领域的技能大有裨益。通过深入研究并实践这个示例,你可以更好地理解和控制Windows环境下的多任务执行,这...

    c++ 任务调度demo

    在IT行业中,任务调度是操作系统的核心功能之一,它在编程领域也有着广泛的应用,尤其是在并发和多线程编程中。本篇文章将详细讲解基于C++的任务调度器,并以GitHub上的开源项目"Bosma/Scheduler"作为参考,探讨其...

    易语言源代码_多线程多任务下载软件.zip

    通过分析和学习这个易语言的多线程多任务下载软件源代码,开发者不仅可以理解如何在易语言中实现多线程,还能了解到如何设计和优化下载管理模块,如任务队列、任务状态管理、错误处理以及进度显示等功能。...

    多任务多线程下载器源码

    标题中的“多任务多线程下载器源码”是指一个软件程序,它的功能是同时...开发者可以通过阅读和学习这个源码,理解如何在实际编程中应用多线程技术来优化性能,以及如何构建一个能够处理多个并发任务的下载管理系统。

    spring 任务调度

    通过深入学习Spring任务调度,开发者可以有效地管理和执行各种定时任务,提升系统的自动化水平。在实际项目中,可以根据需求的复杂程度选择使用Spring Task或是集成Quartz。同时,理解源码有助于我们更高效地利用...

    51单片机简易OS任务调度

    在本文中,我们将深入探讨如何在51单片机上实现一个简单的操作系统(OS),主要关注任务调度。这个话题基于KEIL开发环境和C51编程语言,这是一门专门针对8051系列单片机的编程语言。我们将讨论基本的OS概念,任务...

    易语言多线程执行任务例程

    在“content.txt”文件中,可能包含了具体的易语言多线程编程示例代码,通过分析和学习这些代码,我们可以更好地理解如何在易语言环境中实现和管理多线程任务。对于初学者而言,这是一份宝贵的资源,可以加深对多...

    漫谈兼容内核之二十二 Windows 线程的调度和运行

    Windows采用了抢占式多任务调度策略,这意味着具有更高优先级的线程可以中断当前执行的线程,从而获取CPU时间。Windows提供了多种线程优先级级别,从IDLE_PRIORITY_CLASS到REALTIME_PRIORITY_CLASS,其中NORMAL_...

    Linux多线程学习

    本学习资料详细介绍了Linux环境下的多线程编程,涵盖了线程的创建与退出、线程属性设置、以及两种主要的线程同步机制——互斥锁和信号量。 首先,我们来了解一下线程的创建和退出。在Linux中,创建线程主要通过`...

    用C语言实现任务调度的方式

    在实际应用中,任务调度需要考虑更多的因素,如抢占、上下文切换开销、内存管理等。但这个简单的模拟可以帮助初学者理解任务调度的基本原理,为进一步学习复杂的RTOS打下基础。 通过学习这个非真实RTOS的C语言实现...

    Arduino多任务调度器,实现多任务的轻量级库

    这个库允许开发者在资源有限的Arduino平台上模拟多线程环境,提高程序的执行效率和响应速度。 在描述中提到,该调度器适用于一系列常见的Arduino开发板,包括Arduino Uno R3和Arduino Nano,以及基于WiFi功能的ESP...

    C++11实现多线程电梯运行

    在C++11中,多线程编程是一个重要的特性,它允许程序同时执行多个独立的任务,从而提升程序的效率和并发性。在这个“C++11实现多线程电梯运行”的项目中,开发者利用C++11的线程库来模拟电梯的运行状态和行为,以...

    linux下多线程模拟进程调度程序

    在Linux操作系统中,进程调度是系统管理众多并发执行任务的核心机制。这个程序通过多线程技术,模拟了基于优先级的时间片轮转法,这是一种...对于学习操作系统和多线程编程的人员来说,这是一个非常有价值的实践项目。

    C#多线程多任务管理模型.zip

    在C#编程中,多线程和多任务管理是一个关键的概念,它允许程序同时执行多个独立的任务,提高程序的响应速度和效率。本压缩包文件"**C#多线程多任务管理模型**"提供了相关的代码示例和项目资源,帮助开发者深入理解和...

    Visual_C++_开发的任务调度

    总的来说,这个Visual C++的MFC任务调度项目结合了数据结构、多线程编程、操作系统原理和面向对象设计,对于提升C++编程技能和理解操作系统内核运作机制有着重要的学习意义。通过实际操作,你不仅可以加深对任务调度...

    maven管理的Spring多线程任务demo

    本示例"maven管理的Spring多线程任务demo"着重展示了如何在Spring框架中利用Maven进行项目构建,并实现多线程任务处理。在SSM(Spring、SpringMVC、MyBatis)框架背景下,如果你已经有所了解,那么这个例子将帮助你...

Global site tag (gtag.js) - Google Analytics