线程池2

package interview.pool2;

import interview.pool.ThreadPool;

import java.util.ArrayList;
import java.util.LinkedList;

public class ThreadPool2
{
	// 线程数
	public static int NUM = 5;

	// 线程集合
	private ArrayList threads = new ArrayList();

	// 任务集合
	private LinkedList<Task> tasks = new LinkedList<Task>();

	private static final ThreadPool2 iNSTANCE = new ThreadPool2();

	public static ThreadPool2 getInstance()
	{
		return iNSTANCE;
	}

	// 初始化
	public ThreadPool2()
	{
		for (int i = 0; i < NUM; i++)
		{
			Worker worker = new Worker();
			threads.add(worker);
			worker.start();
		}
	}

	/**
	 * 执行方法
	 */
	public void execute(Task task)
	{
		synchronized (tasks)
		{
			// 1. 加到任务队列最后面
			tasks.addLast(task);
			// 2.唤醒线程
			tasks.notify();
		}
	}

	/**
	 * 内部类:工作者线程
	 */
	private class Worker extends Thread
	{

		public void run()
		{
			// 局部变量更为合理
			Task task;

			while (true)
			{
				synchronized (tasks)
				{
					if (tasks.isEmpty())
					{
						try
						{
							tasks.wait();
						}
						catch (InterruptedException e)
						{
							e.printStackTrace();
						}
					}
					// 取出第一个任务执行
					task = tasks.removeFirst();
				}

				// 必须将该方法提取到synchronized外面执行
				try
				{
					task.execute();
				}
				catch (Exception ex)
				{
					ex.printStackTrace();
				}
			}
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值