IntelliJ IDEA

多线程并发神器--ThreadLocal

折月煮酒 提交于 2020-05-09 15:34:17
什么是ThreadLocal 可以理解成线程本地变量,传统的线程对一个变量操作时操作的是同一个对象,也存在线程安全的问题。 ThreadLocal是一个变量的本地副本,线程对变量的操作不会影响其他线程。 首先看看ThreadLocal的类结构 其中可重写的方法有以下几个 initialValue():ThreadLocal初始化的值,新建ThreadLocal的一般要重写给个初始的值。 get():获取当前线程变量的副本值。 set(T value):设置、更新当前线程上的变量副本值。 remove():移除当前线程上的变量副本。 ThreadLocal使用 新建ThreadLocal,类型为User,并初始化为tom,12岁,启动3个线程,每个线程循环3次,休眠1少,主线程再输出。 输出结果如下 从结果可见每个线程使用的是各自线程的变量副本,并没有影响其他线程和主线程,实现了线程隔离的效果。 使用场景 一般用来解决数据库连接、用户session管理等。 内存泄露问题 如果线程的执行周期过长可能导致内存泄露的风险,虽然线程执行完后会ThreadLocal也会随着销毁,但最好使用完后加上remove这样会加快内存的释放,一般来说线程周期不长是不太会引起内存泄露的。还有如果定义了ThreadLocal又不用也有问题,因为每次ThreadLocal的get/set

20175314 实验五 Java网络编程

我们两清 提交于 2020-05-09 12:08:03
20175314 实验五 Java网络编程 一、实验报告封面 课程:Java程序设计 班级:1753班 姓名:薛勐 学号:20175314 指导教师:娄嘉鹏 实验日期:2018年5月31日 实验时间:15:35 - 17:15 实验序号:五 实验名称: 网络编程与安全 实验目的: 1、掌握Java Socket的相关内容; 2、学会建立客户端与服务器端之间的联系; 3、学习并应用密码学的相关内容 二、实验内容 任务(一) 1、结对实现中缀表达式转后缀表达式的功能 MyBC.java 2、结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java 任务(二) 1、基于Java Socket实现客户端/服务器功能,传输方式用TCP 2、客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器 3、服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端 4、客户端显示服务器发送过来的结果 任务(三) 1、基于Java Socket实现客户端/服务器功能,传输方式用TCP 2、客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器 3、服务器接收到后缀表达式表达式后

Flink 1.10中idea运行出错invalid flag

╄→гoц情女王★ 提交于 2020-05-09 11:29:24
今日好奇,下载Flink 1.10的源码在本机玩一玩。 将工程按照正常流程导入IDEA后,运行flink-examples中的demo竟出现如下错误 Error:java: invalid flag: --add-exports=java.base/sun.net.util=ALL-UNNAMED 通过搜索发现如下文章(见引用),将这个原因描述如下: Flink1.10中编译时默认开启了java11,需要将其关闭并重新导入项目。 去掉下图中java11的复选,并点击上面的reimport即可。 引用 http://apache-flink.147419.n8.nabble.com/Error-java-add-exports-java-base-sun-net-util-ALL-UNNAMED-td943.html 来源: oschina 链接: https://my.oschina.net/u/4355947/blog/4271665

使用Blink SQL+UDAF实现差值聚合计算

孤者浪人 提交于 2020-05-09 11:28:09
本案例根据某电网公司的真实业务需求,通过Blink SQL+UDAF实现实时流上的差值聚合计算,通过本案例,让读者熟悉UDAF编写,并理解UDAF中的方法调用关系和顺序。 感谢@军长在实现过程中的指导。笔者水平有限,若有纰漏,请批评指出。 一、客户需求 电网公司每天采集各个用户的电表数据(格式如下表),其中data_date为电表数据上报时间,cons_id为电表id,r1为电表度数,其他字段与计算逻辑无关,可忽略。为了后续演示方便,仅输入cons_id=100000002的数据。 no(string) data_date(string) cons_id(string) org_no(string) r1(double) 101 20190716 100000002 35401 13.76 101 20190717 100000002 35401 14.12 101 20190718 100000002 35401 16.59 101 20190719 100000002 35401 18.89 表1:输入数据 电网公司希望通过实时计算(Blink)对电表数据处理后,每天得到每个电表最近两天(当天和前一天)的差值数据,结果类似如下表: cons_id(string) data_date(string) subDegreeR1(double) 100000002 20190717 0

android studio: no idea annotations attached to the jdk 1.8 some issues will not be found

微笑、不失礼 提交于 2020-05-09 10:49:55
Android Studio今天早上打开项目提示错误信息: No IDEA annotations attached to the JDK 1.8 (C:\Program Files\Android\Android Studio\jre), some issues will not be found 重新打开文件或者重新同步工程都无解,最后在 https://stackoverflow.com/questions/50740240/no-idea-annotations-attached-to-the-jdk-1-8-c-some-issues-will-not-be-fo 找到了解决方案。 解决 首先关闭Android Studio 打开计算机,转到 C:\Users\UserName\.android 文件夹,将 build-cache 文件夹重命名为 build-cache.bak 转到 C:\Users\UserName\.AndroidStudio3.2\system 文件夹,并重命名下面的文件夹: 原文件夹名 重命名后 caches caches.bak compiler compiler.bak compile-server compile-server.bak conversion conversion.bak external_build_system

一张图弄懂java线程的状态和生命周期

橙三吉。 提交于 2020-05-09 10:03:20
上图是一个线程的生命周期状态流转图,很清楚的描绘了一个线程从创建到终止的过程。 这些状态的枚举值都定义在java.lang.Thread.State下 NEW:毫无疑问表示的是刚创建的线程,还没有开始启动。 RUNNABLE: 表示线程已经触发start()方式调用,线程正式启动,线程处于运行中状态。 BLOCKED:表示线程阻塞,等待获取锁,如碰到synchronized、lock等关键字等占用临界区的情况,一旦获取到锁就进行RUNNABLE状态继续运行。 WAITING:表示线程处于无限制等待状态,等待一个特殊的事件来重新唤醒,如通过wait()方法进行等待的线程等待一个notify()或者notifyAll()方法,通过join()方法进行等待的线程等待目标线程运行结束而唤醒,一旦通过相关事件唤醒线程,线程就进入了RUNNABLE状态继续运行。 TIMED_WAITING:表示线程进入了一个有时限的等待,如sleep(3000),等待3秒后线程重新进行RUNNABLE状态继续运行。 TERMINATED:表示线程执行完毕后,进行终止状态。 需要注意的是,一旦线程通过start方法启动后就再也不能回到初始NEW状态,线程终止后也不能再回到RUNNABLE状态。 推荐去我的博客阅读更多: 1. Java JVM、集合、多线程、新特性系列教程 2. Spring MVC

[七月挑选]IntelliJ IDEA常用设置

做~自己de王妃 提交于 2020-05-08 19:59:08
设置idea的类注释快捷键 File -> Settings -> Live Templates 1.右边的 + -> Templates Group -> 输入:LTModel 2.右边的 + -> Live Templates -> 为Abbreviation输入:pClassNote,为Description输入:自定义类注释 Template text: /** * @author:porschan * @description: * @date: Created in $TIME$ $DATE$ * @modified By: */ 3.设置变量,点击右侧的Edit variables Name Expression Default value Skip if defined TIME time() □ DATE date() □ 设置idea的类注释 File -> Settings -> Editor -> File and Code Templates ,如图: /** * @author:porschan * @description: * @date: Created in ${TIME} ${DATE} * @modified By: */ 设置idea的背景图 1.open IDEA -> File -> Settings -> Plugins ,如图 2

开发手册

两盒软妹~` 提交于 2020-05-08 18:59:47
当你看到这一章节时,你估计会骂我鸡婆。IoC,这个还要你来告诉我,我用SpringFramework已经很久啦。但我还是要说一下。IDEA整个组件结构是基于PicoContainer( http://www.picocontainer.org )的,PicoContainer是一个高效的嵌入式的DI容器。如果你有时间的话,我建议你花5分钟浏览一下PicoContainer,然后回到这篇文档来。 PicoContainer是有层次结构的,就是一个container可以包含子container,子容器可以访问父容器中的组件,而各个子容器直接是独立的。在IDEA中,主要有三种container:Application, Project和Module,分别包含不同的组件。application container包含多个project container,project container可以包含多个module container,如下图: 这样各个project container是独立的,都可以访问application container中的组件;module container也是独立的,可以访问所属project container和application container中的组件。这个图是我们后面理解application component, project

多线程并发神器--ThreadLocal

≯℡__Kan透↙ 提交于 2020-05-08 18:23:34
什么是ThreadLocal 可以理解成线程本地变量,传统的线程对一个变量操作时操作的是同一个对象,也存在线程安全的问题。 ThreadLocal是一个变量的本地副本,线程对变量的操作不会影响其他线程。 首先看看ThreadLocal的类结构 其中可重写的方法有以下几个 initialValue():ThreadLocal初始化的值,新建ThreadLocal的一般要重写给个初始的值。 get():获取当前线程变量的副本值。 set(T value):设置、更新当前线程上的变量副本值。 remove():移除当前线程上的变量副本。 ThreadLocal使用 新建ThreadLocal,类型为User,并初始化为tom,12岁,启动3个线程,每个线程循环3次,休眠1少,主线程再输出。 输出结果如下 从结果可见每个线程使用的是各自线程的变量副本,并没有影响其他线程和主线程,实现了线程隔离的效果。 使用场景 一般用来解决数据库连接、用户session管理等。 内存泄露问题 如果线程的执行周期过长可能导致内存泄露的风险,虽然线程执行完后会ThreadLocal也会随着销毁,但最好使用完后加上remove这样会加快内存的释放,一般来说线程周期不长是不太会引起内存泄露的。还有如果定义了ThreadLocal又不用也有问题,因为每次ThreadLocal的get/set

Netty 如何实现心跳机制与断线重连?

最后都变了- 提交于 2020-05-08 16:32:22
作者:sprinkle_liz www.jianshu.com/p/1a28e48edd92 心跳机制 何为心跳 所谓心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 注:心跳包还有另一个作用,经常被忽略,即: 一个连接如果长时间不用,防火墙或者路由器就会断开该连接。 如何实现 核心Handler —— IdleStateHandler 在 Netty 中, 实现心跳机制的关键是 IdleStateHandler, 那么这个 Handler 如何使用呢? 先看下它的构造器: public IdleStateHandler(int readerIdleTimeSeconds, int writerIdleTimeSeconds, int allIdleTimeSeconds) { this((long)readerIdleTimeSeconds, (long)writerIdleTimeSeconds, (long)allIdleTimeSeconds, TimeUnit.SECONDS); } 这里解释下三个参数的含义: readerIdleTimeSeconds: 读超时. 即当在指定的时间间隔内没有从 Channel 读取到数据时, 会触发一个 READER_IDLE 的