public class Master<E> {
private volatile BlockingQueue<? super E> TaskQueue;
private volatile BlockingQueue<? super Object> resultQueue;
private volatile Map<String,Callable> wokersMap;
private ThreadPoolExecutor threadPool;
private AtomicInteger finishNum = new AtomicInteger(-1);
private static Integer DEFAULT_CAPACITY = 1200;
private volatile Lock lock = new ReentrantLock();
private List<Future> futureList = new ArrayList<>();
private AtomicBoolean flag = new AtomicBoolean(false);
private final static Logger logger = LoggerFactory.getLogger(Master.class);
public Master(Worker worker, Integer workThreads, Integer capacity){
threadPool = new ThreadPoolExecutor(
10,
30,
1000L,
TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(capacity),
new MWRejection());
TaskQueue = new ArrayBlockingQueue<E>(capacity);
wokersMap = new HashMap();
resultQueue = new LinkedBlockingQueue<Object> ();
worker.setTaskQueue(this.TaskQueue);
worker.setResultQueue(this.resultQueue);
for (Integer i = 0; i < workThreads; i++) {
wokersMap.put(Integer.toString(i),worker);
}
logger.info("{}个worker已经启动",workThreads);
}
public Master(Worker worker, Integer workThreads){
this(worker,workThreads,DEFAULT_CAPACITY);
}
public void executeThread(){
wokersMap.forEach((k,v)->{
Future future = threadPool.submit(v);
futureList.add(future);
});
}
public void submitTask(E task){
lock.lock();
try {
this.TaskQueue.put(task);
logger.info("task add {}",task.toString());
}catch (Exception e){
System.out.println("提交失败");
logger.error("{}提交失败",task);
}finally {
lock.unlock();
}
}
public boolean isComplete(){
lock.lock();
try{
if(futureList != null)
for (Future f : futureList) {
if (!f.isDone()) {
return false;
}
}
return true;
}catch (Exception e){
return flag.get();
}finally {
System.out.println("准备释放lock");
lock.unlock();
}
}
public Boolean get(){
lock.lock();
try {
flag.set(true);
for (Future f : futureList) {
if(!(Boolean) f.get()){
flag.set(false);
System.out.println("future failure");
}
}
} catch (Exception e) {
flag.set(false);
e.printStackTrace();
}finally {
lock.unlock();
}
threadPool.shutdownNow();
System.out.println("完成了"+flag.get());
return flag.get();
}
public Integer getFinishedSum(){
lock.lock();
Integer sum = 0;
try{
if (this.get()){
if( resultQueue != null){
this.finishNum.incrementAndGet();
for (Object v:
resultQueue) {
if(v != null){
sum += (Integer) v;
}
}
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
return sum;
}
}
@ConcurrentSafe
public abstract class Worker<E> implements Callable {
private BlockingQueue<? extends E> taskQueue;
private BlockingQueue<? super Object> resultQueue;
private volatile Lock lock = new ReentrantLock();
private static AtomicLong TaskID = new AtomicLong(0L);
public void setResultQueue(BlockingQueue<Object> resultQueue) {
this.resultQueue = resultQueue;
}
public void setTaskQueue(BlockingQueue<E> taskQueue) {
this.taskQueue = taskQueue;
}
private E getOne(){
lock.lock();
try {
if(taskQueue.size() != 0 && !taskQueue.isEmpty())
return this.taskQueue.poll();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}finally {
lock.unlock();
}
}
public Boolean call() {
while(true){
try {
E task = getOne();
if(task == null){
break;
}
Object result = handle(task);
resultQueue.put(result);
TaskID.incrementAndGet();
}catch (Exception e){
e.printStackTrace();
return false;
}
}
return true;
}
public abstract Object handle(E task);
public abstract Class<E> getTaskClass();
public static long getTaskID(){
return TaskID.get();
}
}