using System;
using System.Collections.Generic;
using System.Threading;
using Thousandto.Update.Delegate;
using Thousandto.Update.Log;
namespace Thousandto.Update.Download
{
///
/// 线程池
///
public class HttpThreadPool
{
int _count;
bool _stop;
bool _waitWhileWorking;
ThreadPoolAction _action;
List _threadQueue;
Queue _taskList;
public HttpThreadPool(int maxThreadCount, ThreadPoolAction action)
{
_action = action;
_count = maxThreadCount;
_stop = false;
_waitWhileWorking = false;
_threadQueue = new List();
_taskList = new Queue();
for (int i = 0; i < _count; i++)
{
Thread thread = new Thread(threadFunc);
thread.Name = "download thread: " + i;
thread.Start();
_threadQueue.Add(thread);
}
}
public void waitWhileWorking()
{
_waitWhileWorking = true;
join();
}
public void stop()
{
_stop = true;
//Thread.Sleep(100);
//join();
}
//尽量不用这个方法, ios的IL2CPP调用thread的abort的时候会崩溃
public void Abort()
{
for (int i = 0; i < _threadQueue.Count; ++i)
{
if (_threadQueue[i] != null && _threadQueue[i].IsAlive)
{
_threadQueue[i].Abort();
}
}
}
private void join()
{
for (int i = 0; i < _threadQueue.Count; i++)
{
_threadQueue[i].Join();
}
_taskList.Clear();
_threadQueue.Clear();
}
public void addTask(T data)
{
lock (_taskList)
{
_taskList.Enqueue(data);
}
}
private T getTask()
{
lock (_taskList)
{
if (_taskList.Count > 0)
{
return _taskList.Dequeue();
}
return default(T);
}
}
public void threadFunc()
{
while (_stop == false)
{
T data = getTask();
if (data == null)
{
Console.WriteLine(Thread.CurrentThread.Name + " is sleeping");
Thread.Sleep(20);
if (_waitWhileWorking)
{
lock (_taskList)
{
if (_taskList.Count == 0)
{
return;
}
}
}
}
else
{
dowork(data);
}
}
UpdateLog.DEBUG_LOG("Thread abort: " + Thread.CurrentThread.Name);
}
private void dowork(T fileData)
{
//这里lock的话,就变成单线程下载了,无意义
//lock (_httpDownloadInstance)
{
if (_action != null)
{
_action(fileData);
}
}
}
}
}