不考虑多服务器,限制线程池的大小和队列的限制来实现。
代码如下:
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
}
}
具体的业务还是得需要你自己定制.\x0d你的需求实际上是一个变形的生产者-消费者实现.对于此类需求,主要是将请求和实际的处理过程解耦,一般都是采取异步的方式来通知请求方,
这跟用不用redis其实没有多大的关系.一般的实现方法是你需要将用户的请求封装成一个Task,
然后将这个Task再push到redis队列,然后后端的worker.php完全可以多进程、
多线程的并发处理Task并将处理结果回调给请求方.这里唯一麻烦点的就是这个Task的设计,
需要能够包含请求信息(请求内容,请求方标识等等).