旭日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();
            }

}
    }
}

java多线程高并发的更多相关文章

  1. Java 多线程高并发编程 笔记(一)

    本篇文章主要是总结Java多线程/高并发编程的知识点,由浅入深,仅作自己的学习笔记,部分侵删. 一 . 基础知识点 1. 进程于线程的概念 2.线程创建的两种方式 注:public void run( ...

  2. Java多线程高并发学习笔记(二)——深入理解ReentrantLock与Condition

    锁的概念 从jdk发行1.5版本之后,在原来synchronize的基础上,增加了重入锁ReentrantLock. 本文就不介绍synchronize了,有兴趣的同学可以去了解一下,本文重点介绍Re ...

  3. Java多线程高并发学习笔记(一)——Thread&Runnable

    进程与线程 首先来看百度百科关于进程的介绍: 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体.它不只是程序的代码,还包括当前的 ...

  4. Java多线程高并发学习笔记——阻塞队列

    在探讨可重入锁之后,接下来学习阻塞队列,这边篇文章也是断断续续的写了很久,因为最近开始学ssm框架,准备做一个自己的小网站,后续可能更新自己写网站的技术分享. 请尊重作者劳动成果,转载请标明原文链接: ...

  5. Java 多线程高并发编程 笔记(二)

    1. 单例模式(在内存之中永远只有一个对象) 1.1 多线程安全单例模式——不使用同步锁 public class Singleton { private static Singleton sin=n ...

  6. java多线程高并发知识总结

    1.      计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...

  7. java多线程高并发的学习

    1.      计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...

  8. JAVA多线程高并发学习笔记(三)——Callable、Future和FutureTask

    为什么要是用Callable和Future Runnable的局限性 Executor采用Runnable作为基本的表达形式,虽然Runnable的run方法能够写入日志,写入文件,写入数据库等操作, ...

  9. JAVA多线程---高并发程序设计

    先行发生原则 程序顺序原则:一个线程内保证语义的串行性 volatile:volatile变量的写,先发生于读,这保证了volatile变量的可见性 锁规则:解锁必然发生在随后的加锁前 传递性:A优先 ...

随机推荐

  1. 【百度杯】ctf夺旗大战,16万元奖励池等你拿

    寻找安全圈内最会夺flag的CTF职业玩家,将以个人方式参与夺旗,完全凭借个人在CTF中的技艺及造诣获得奖金回报. 周末少打一局LOL,玩一玩CTF也能挣个万元零花钱! **比赛时间: 9月至17年3 ...

  2. FFmpeg Android 学习(一):Android 如何调用 FFMPEG 编辑音视频

    一.概述 在Android开发中,我们对一些音视频的处理比较无力,特别是编辑音视频这部分.而且在Android上对视频编辑方面,几乎没有任何API做支持,MediaCodec(硬编码)也没有做支持.那 ...

  3. eclipse对于标签的配置不会出现自动提示的解决

    解决办法:引入 mybatis-3-config.dtd 文件Window-preferences-搜索 xml-xml catalog在 User Specified Entries 目录下 add ...

  4. 第89节:Java中的反射技术

    第89节:Java中的反射技术 反射技术是动态的获取指定的类,和动态的调用类中的内容(没有类前就可以创建对象,将对象的动作完成,这就是动态的获取指定的类). 配置文件把具体实现的类名称定义到配置文件中 ...

  5. 第56节:ArrayList,LinkedList和String

    import java.util.ArrayList; public class Demo{ public static void main(String[] args) throws Excepti ...

  6. input在ios safari中的内阴影解决方法

    最近发现 input 在 ios的 safari浏览器里显示时,会默认有内阴影,如下图 解决方法: input { -webkit-appearance: none; } -webkit-appear ...

  7. 朴素贝叶斯算法简介及python代码实现分析

    概念: 贝叶斯定理:贝叶斯理论是以18世纪的一位神学家托马斯.贝叶斯(Thomas Bayes)命名.通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A(发生)的条件下的概率是不一样的:然而 ...

  8. Net Core集成Exceptionless分布式日志功能以及全局异常过滤

    Net Core集成Exceptionless分布式日志功能以及全局异常过滤 相信很多朋友都看过我的上篇关于Exceptionless的简单入门教程[asp.Net Core免费开源分布式异常日志收集 ...

  9. springBoot(1)---springboot初步理解

    springboot初步理解 在没有用SpringBoot之前,我们用spring和springMVC框架,但是你要做很多比如: (1)配置web.xml,加载spring和spring mvc 2) ...

  10. CentOS5/6/7系统下搭建安装Amabari大数据集群时出现SSLError: Failed to connect. Please check openssl library versions.错误的解决办法(图文详解)

    不多说,直接上干货! ========================== Creating target directory... ========================== Comman ...