用java如何实现秒杀流程啊

Python018

用java如何实现秒杀流程啊,第1张

不考虑多服务器,限制线程池的大小和队列的限制来实现。

代码如下:

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的设计,

需要能够包含请求信息(请求内容,请求方标识等等).

值得买

关注

1、java高并发秒杀项目 这是一个教你如何使用 Java 语言来设计高并发大流量秒杀架构的项目,需要学习的小伙伴需要先了解MQ、SpringBoot、Redis、Dubbo、ZK 、Maven,lua等知识

2、JavaGuide 官方知识星球 一份涵盖大部分Java程序员所需要掌握的核心知识,面试技巧,知识拓展和学习等。

3、Spring Boot 实践指南 这个当前版本中最全的spring boot 学习指南 ,里面涵盖了Spring Boot知识点整理、工程实践,并结合工作案例进行深入。

4、EasyExcel EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。

5、Spring 系列教程 里面包含了包含Spring Boot、Spring Boot &Shiro、Spring Cloud,Spring Boot &Spring Security &Spring Security OAuth2 循序渐进的让小伙伴掌握Spring 编程技巧。

6、Arthas 当你遇到以下类似问题而手无策时,可以帮助Arthas你解决:

这个类从哪个jar包加载的?为什么会报各种类相关的Exception?

我改的代码为什么没有执行到?那是我没提交?分支搞错了?

遇到问题无法在线调试,只能通过加日志重新发布吗?

线上遇到有时用户的数据无法出现问题,线上同样无法调试,无法处理!

是否有不同的视角来查看系统的运行状况?

有什么办法可以监控到JVM的实时运行状态?

怎么快速定位应用的热点,生成火焰图?

怎样直接从JVM内查找类的实例?

7、JCSprout 里面整理了 常用集合,java多线程 ,JVM,分布式,常用框架\第三方组件,架构设计,DB 相关,数据结构与算法,Netty 相关的资料和demo

8、古诗词API 是一个可以随机返回一句古诗词名句的API接口,使用 Vert.x Java 全异步框架开发,使用 Redis 数据库,确保毫秒级稳定响应,支持 svg / txt / json / png 调用,满足你在任何地方的调用需求,可以根据你的喜好,在指定的分类中进行随机返回,提供完整单元测试,已经过数百万次调用。

9、technology-talk 一份汇总 Java 生态圈常用技术框架、开源中间件,系统架构、项目管理、经典架构案例、数据库、常用三方库、线上运维,职业规划等知识。

10、30-seconds-of-java8 一个可以在30秒或更短时间内收集有用的Java8代码片段。对java语法不熟悉的小伙伴可以参考一下。