java 简单秒杀

以下代码 不考虑多服务器

限制线程池的大小 和队列的限制来实现

 

package org.zhang;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 单服务器用线程池实现秒杀的思路一
 * 
 * @author zhanghaijun
 * 
 */
public class ExecutorsTest {

	public static boolean flag = true; // 秒杀物品的标记

	public static void main(String[] args) {
		ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 1, 0L,
				TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>());
		ThreadTest t1 = new ThreadTest("张三");
		ThreadTest t2 = new ThreadTest("李四");
		ThreadTest t3 = new ThreadTest("王五");
		try {
			pool.execute(t1);
		} catch (Exception e) {
			System.out.println(t1.getUserName() + "没有抢到");
		}

		try {
			pool.execute(t3);
		} catch (Exception e) {
			System.out.println(t3.getUserName() + "没有抢到");
		}

		try {
			pool.execute(t2);
		} catch (Exception e) {
			System.out.println(t2.getUserName() + "没有抢到");
		}
		pool.shutdown();
	}

}

class ThreadTest extends Thread {

	private String userName;

	public ThreadTest(String userName) {
		super();
		this.userName = userName;
	}

	@Override
	public void run() {
		try {
			Thread.sleep(200);
			if (ExecutorsTest.flag) {
				System.out.println(this.userName + "秒杀成功");
				ExecutorsTest.flag = false;
			}

		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

}
posted @ 2017-05-19 20:15  欧阳平  阅读(1297)  评论(0编辑  收藏  举报