java多线程处理业务

来源:互联网 发布:百度云的域名怎么转发 编辑:程序博客网 时间:2024/06/06 15:41
public class Test {


private static int count = 0;
public static ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
static {
PropertyConfigurator.configure("config/log4j.prop");
}


public static void main(String[] args) {
//启动队列线程
MessageTask task= MessageTask.getInstance();
new Thread(task).start();

//启动测试线程
sendThread runnable = new Test().new sendThread();
ScheduledExecutorService service =  Executors.newScheduledThreadPool(1);
service.scheduleAtFixedRate(runnable, 0, 3, TimeUnit.MILLISECONDS);

}

private class sendThread implements Runnable{
@Override
public void run() {
count++;
Message message = new Message();
message.setMobile(String.valueOf(count));
message.setContent("这不是数据");
MessageTask.addMessage(message);
}
}

}


public class MessageTask implements Runnable {
private static final BlockingQueue<Message> queue = new LinkedBlockingQueue<Message>();
private static final MessageTask instance = new MessageTask();

private MessageTask() {
}

public static MessageTask getInstance() {
if (instance != null) {
new MessageTask();
}
return instance;
}

@Override
public void run() {
Map<String, innerThread> map = new HashMap<String, innerThread>();
for (int i = 0; i < 10; i++) {
innerThread runnable = new innerThread();
Thread thread = new Thread(runnable);
thread.setName("线程" + i);
thread.start();
map.put(i + "", runnable);
}

while (true) {
Message message = queue.poll();
if (message == null) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {


}
continue;
}
String key = StringUtil.getLastChar(message.getMobile());
innerThread runnable = map.get(key);
runnable.addMessage(message);
}

}

public static void addMessage(Message message) {
queue.add(message);
System.out.println("队列大小:" + queue.size());
}

// 内部类,处理线程
private class innerThread implements Runnable {
private LinkedList<Message> list = new LinkedList<Message>();

public void addMessage(Message message) {
list.addLast(message);
}

public void run() {
while (true) {
Message message = list.poll();
if (message == null) {
try {
System.out.println(Thread.currentThread().getName() + ":队列无数据");
Thread.sleep(500);
} catch (InterruptedException e) {
}
continue;
}
double l = (Math.PI + Math.E);
String threadName = Thread.currentThread().getName();
System.out.println(threadName + ":" + message.getMobile() + "," + message.getContent());
}

}
}

说明:队列线程启动后,同时开启十个处理线程,通过取末将数据投递到对应线程中去处理.队列线程中涉及添加和取出,所有用LinkedBlockingQueue,处理线程则独有自己的集合,所以用linkedList,

练手程序,请勿轻信