• java多线程高并发


    旭日Follow_24 的CSDN 博客 ,全文地址请点击:

    https://blog.csdn.net/xuri24/article/details/81293321

    “高并发和多线程”总是被一起提起,给人感觉两者好像相等,实则 高并发 ≠ 多线程

      多线程是完成任务的一种方法,高并发是系统运行的一种状态,通过多线程有助于系统承受高并发状态的实现

    一,高并发与多线程

    1,高并发:高并发不是JAVA的专有的东西,是语言无关的广义的,为提供更好互联网服务而提出的概念。高并发想让服务器(tomcat)能接受处理多用户多请求。

    2,多线程:多线程只是为了达到高并发目的(首先得有多线程接收处理多任务,才有高并发发生)。在某个细节点上,为实现某并发功能而采用的一种具体的实现方法,这种功能也可以由多进程实现,

    当然,也可以由多进程,多线程一起实现。这是战术上的并行。

    总之:高并发是一种现象,多线程是一种Java提高性能的手段

    其实就是用CountDownLatch来使多个线程同时运行,同时发送请求,虽然post的事件不能保证同时,但发post能保证同时(相差0.2毫秒),通过这种方法,测试了redis的setkey,getkey来保证不重复数据的时间阈值在几百纳秒,再短就算redis也无能为力了,所以多线程虽然快,但是没锁,还是不太安全。。

    @Service

    public class TestConcurrentService {


        @Autowired
        private ApiHttpClientService apiHttpClientService;


        private static final Logger logger = Logger.getLogger(TestConcurrentService.class);


        public void testConcurrent1(String sign) {


            ExecutorService exec = Executors.newFixedThreadPool(3);
            CountDownLatch begin = new CountDownLatch(1);
            CountDownLatch end = new CountDownLatch(3);
            for (int i = 0; i < 3; i++) {
                exec.execute(new HttpRequestUtils(begin, end, sign));


            }
            begin.countDown();


            try {
                end.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
            }
            exec.shutdown();
            logger.info("main method end");
        }


        public class HttpRequestUtils implements Runnable {
            private Logger log = Logger.getLogger(HttpRequestUtils.class);


            private CountDownLatch begin;
            private CountDownLatch end;


            private String sign;


            private String url = "http://localhost:8080/score/private/v1/injectsg";


            public HttpRequestUtils(CountDownLatch begin, CountDownLatch end, String sign) {
                this.begin = begin;
                this.end = end;
                this.sign = sign;


            }


            @Override
            public void run() {
                try {
                    begin.await();
                    Map<String, String> header = new HashMap<>();
                    header.put("Content-Type", "application/json");
                    header.put("sign", sign);


                    ScoreRequestBean bean = new ScoreRequestBean();
                    Data data = new Data();
                    data.setRemark("单发测试");
                    data.setExtId("ext111111519");
                    data.setPartnerMemberId(297);
                    data.setPoints(1);
                    bean.setData(data);
                    bean.setEventId("123asdasd");
                    System.out.println("线程" + Thread.currentThread().getName() +
                            "已接受命令," + "时间为:" + System.nanoTime() + "|" + System.nanoTime() / 1000000L);


                    apiHttpClientService.post(url, null, header, bean, ResultConstant.class);
                    System.out.println("线程" + Thread.currentThread().getName() +
                            "命令已结束");
                } catch (Exception e) {
                    log.error(e.getMessage(), e);
                } finally {
                    end.countDown();
                }


            }
        }
    }

     

  • 相关阅读:
    零基础学python-2.7 列表与元组
    什么是App加壳,以及App加壳的利与弊
    Linux tar包安装Nginx
    GT背靠背onsite
    编程算法
    DELPHI动态创建窗体
    扩展名为DBF的是什么文件啊?
    异构数据库之间完全可以用SQL语句导数据
    XP局域网访问无权限、不能互相访问问题的完整解决方案
    Delphi 之 菜单组件(TMainMenu)
  • 原文地址:https://www.cnblogs.com/Liuq-24/p/9695117.html
Copyright © 2020-2023  润新知