用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

JAVA线程池的实现 和 优先级设置

2012-12-22 作者: 海大软件1102班举报

[java]代码库

import java.util.LinkedList;
import java.util.List;

/**
 * 
 * Title: LoonFramework
 * 
 * 
 * Description:
 * 
 * 
 * Copyright: Copyright (c) 2007
 * 
 * 
 * Company: LoonFramework
 * 
 * 
 * @author chenpeng
 * @email:ceponline@yahoo.com.cn
 * @version 0.1
 */
public class ThreadPool {

	private static ThreadPool instance = null;

	// 优先级低
	public static final int PRIORITY_LOW = 0;

	// 普通
	public static final int PRIORITY_NORMAL = 1;

	// 高
	public static final int PRIORITY_HIGH = 2;

	// 用以保存空闲连接
	private List[] _idxThreads;

	// 关闭
	private boolean _shutdown = false;

	// 线程数量
	private int _threadCount = 0;

	// debug信息是否输出
	private boolean _debug = false;

	/** */
	/**
	 * 返回ThreadPool实例
	 * 
	 * @return
	 */
	public static ThreadPool getInstance() {
		if (instance == null) {
			instance = new ThreadPool();
		}
		return instance;
	}

	// 初始化线程list
	private ThreadPool() {
		this._idxThreads = new List[] { new LinkedList(), new LinkedList(),
				new LinkedList() };
		this._threadCount = 0;
	}

	/** */
	/**
	 * 同步方法,完成任务后将资源放回线程池中
	 * 
	 * @param repool
	 */
	protected synchronized void repool(Pooled repool) {
		if (this._shutdown) {
			if (this._debug) {
				System.out.println("ThreadPool.repool():重设中……");
			}
			// 优先级别判定
			switch (repool.getPriority()) {
			case Thread.MIN_PRIORITY:
				this._idxThreads[PRIORITY_LOW].add(repool);
				break;
			case Thread.NORM_PRIORITY:
				this._idxThreads[PRIORITY_NORMAL].add(repool);
				break;
			case Thread.MAX_PRIORITY:
				this._idxThreads[PRIORITY_HIGH].add(repool);
				break;
			default:
				throw new IllegalStateException("没有此种级别");
			}
			// 通知所有线程
			notifyAll();

		} else {
			if (this._debug) {
				System.out.println("ThreadPool.repool():注销中……");
			}
			repool.shutDown();
		}
		if (this._debug) {
			System.out.println("ThreadPool.repool():完成");
		}
	}

	public void setDebug(boolean debug) {
		this._debug = debug;
	}

	public synchronized void shutDown() {
		this._shutdown = true;
		if (this._debug) {
			System.out.println("ThreadPool.shutDown():关闭中……");
		}
		for (int index = 0; index <= PRIORITY_NORMAL; index++) {
			List threads = this._idxThreads[index];
			for (int threadIndex = 0; threadIndex < threads.size(); threadIndex++) {
				Pooled idleThread = (Pooled) threads.get(threadIndex);
				idleThread.shutDown();
			}
		}
		notifyAll();
	}

	/** */
	/**
	 * 以指定的优先级启动线程
	 * 
	 * @param target
	 * @param priority
	 */
	public synchronized void start(Runnable target, int priority) {
		Pooled thread = null;
		List idleList = this._idxThreads[priority];
		int idleSize = idleList.size();

		if (idleSize > 0) {
			int lastIndex = idleSize - 1;
			thread = (Pooled) idleList.get(lastIndex);
			idleList.remove(idleList);
			thread.setTarget(target);
		} else {
			this._threadCount++;
			thread = new Pooled(target, "Pooled->" + this._threadCount, this);
			switch (priority) {

			case PRIORITY_LOW:
				thread.setPriority(Thread.MIN_PRIORITY);
				break;
			case PRIORITY_NORMAL:
				thread.setPriority(Thread.NORM_PRIORITY);
				break;
			case PRIORITY_HIGH:
				thread.setPriority(Thread.MAX_PRIORITY);
				break;
			default:
				thread.setPriority(Thread.NORM_PRIORITY);
			}
			// 启动
			thread.start();

		}

	}

	/** */
	/**
	 * 返回线程数量
	 * 
	 * @return
	 */
	public int getThreadsCount() {
		return this._threadCount;
	}

}




/**
 * 
 * Title: LoonFramework
 * 
 * 
 * Description:
 * 
 * 
 * Copyright: Copyright (c) 2007
 * 
 * 
 * Company: LoonFramework
 * 
 * 
 * @author chenpeng
 * @email:ceponline@yahoo.com.cn
 * @version 0.1
 */
public class Pooled extends Thread {

	private ThreadPool _pool;

	private Runnable _target;

	private boolean _shutdown = false;

	private boolean _idle = false;

	public Pooled(Runnable target) {
		super(target);
	}

	public Pooled(Runnable target, String name) {
		super(target, name);
	}

	public Pooled(Runnable target, String name, ThreadPool pool) {
		super(name);
		this._pool = pool;
		this._target = target;
	}

	public Pooled(String name) {
		super(name);
	}

	public Pooled(ThreadGroup group, Runnable target) {
		super(group, target);
	}

	public Pooled(ThreadGroup group, Runnable target, String name) {
		super(group, target, name);
	}

	public Pooled(ThreadGroup group, String name) {
		super(group, name);
	}

	public Runnable getTarget() {
		return this._target;
	}

	public boolean isIdle() {
		return this._idle;
	}

	public void run() {
		while (!this._shutdown) {
			this._idle = false;
			if (this._target != null) {
				this._target.run();
			}
			this._idle = true;
			try {

				this._pool.repool(this);

				synchronized (this) {
					wait();
				}

			} catch (InterruptedException ex) {
				System.err.println(ex.getMessage());
			}
			this._idle = false;
		}
	}

	public synchronized void setTarget(Runnable target) {
		this._target = target;
		notifyAll();
	}

	public synchronized void shutDown() {
		this._shutdown = true;
		notifyAll();
	}

}




//测试用类:
package org.loon.framework.util.test;
/** *//**
* Title: LoonFramework 
* Description:线程池测试 
* Copyright: Copyright (c) 2007 
* Company: LoonFramework 
* @author chenpeng  
* @email:ceponline@yahoo.com.cn 
* @version 0.1
*/
public class ThreadPoolTest  {


private static Runnable createRunnable(final int id)  {
    return new Runnable()  {
        public void run()  {
            System.out.println("线程" + id + ",运行 ");
            try  {
                Thread.sleep(1000);
            }
            catch (InterruptedException ex)  { }
            System.out.println("线程" + id + ",结束");
        }
    };
}

public static void main(String[]args) {
    ThreadPool pool=ThreadPool.getInstance();
    pool.setDebug(true);
     for (int i=1; i<=10; i++)  {
         //根据数值,设定不同优先级
         if(i%2==0) {
                 pool.start(createRunnable(i), ThreadPool.PRIORITY_HIGH);
         }else {
                 pool.start(createRunnable(i), ThreadPool.PRIORITY_LOW);
         }
     }
    System.out.println("线程池测试中……");
    System.out.println("线程池线程总数:"+pool.getThreadsCount());
    pool.shutDown();
}
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...