任務處理隊列簡單demo2

本篇在上篇的基礎上進行擴展。可以用來處理一些單線程基本任務。比如發郵件,發短信等。 具體業務請實現IHandler接口。

package com;

import java.util.concurrent.ConcurrentLinkedQueue;

public class TaskConsumer<T>  implements Runnable {
	
	private ConcurrentLinkedQueue<T> queue;

	private IHandler<T> handler;

	private boolean stop;
	
	
	public boolean isStop() {
		return stop;
	}

	public void setStop(boolean stop) {
		this.stop = stop;
	}

	public IHandler<T> getHandler() {
		return handler;
	}

	public void setHandler(IHandler<T> handler) {
		this.handler = handler;
	}

	public ConcurrentLinkedQueue<T> getQueue() {
		return queue;
	}

	public void setQueue(ConcurrentLinkedQueue<T> queue) {
		this.queue = queue;
	}

	@Override
	public void run() {
		while (!stop) {
			T poll = queue.poll();
			if (poll != null) {
				handler.handle(poll);
			} 
		}

	}
}
package com;

import java.util.concurrent.ConcurrentLinkedQueue;

public class TaskQueue<T> {
	private ConcurrentLinkedQueue<T> queue = new ConcurrentLinkedQueue<>();
	private TaskConsumer<T> consumer = new TaskConsumer<>();
	
	private boolean isStart;
	
	public Thread start(IHandler<T> handler) {
		if (isStart) {
			throw new RuntimeException("has started");
		}
		isStart = true;
		consumer.setQueue(queue);
		consumer.setHandler(handler);
		Thread thread = new Thread(consumer);
		thread.start();
		return thread;
	}
	
	
	public void put(T t) {
		queue.add(t);
	}
	public int size() {
		return queue.size();
	}
	public void stop() {
		consumer.setStop(true);
	}
}

測試:

public static void main(String[] args) throws InterruptedException {
		TaskQueue<String> taskQueue = new TaskQueue<>();
		taskQueue.start(new IHandler<String>() {
			@Override
			public void handle(String t) {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					
					e.printStackTrace();
				}
				System.out.println(t);
			}
		});
		for (int i = 0; i < 20; i++) {
			
			
			taskQueue.put("來來來"+i);
		}
		Thread.currentThread().sleep(3000);
		
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章