- 博客(59)
- 收藏
- 关注
原创 Java并发编程(二)如何保证线程同时/交替执行
第一篇文章中,我用如何保证线程顺序执行的例子作为Java并发系列的开胃菜。本篇我们依然不会有源码分析,而是用另外两个多线程的例子来引出Java.util.concurrent中的几个并发工具的用法。系列文章Java并发编程(一)如何保证线程顺序执行一、如何保证多个线程同时执行保证多个线程同时执行,指的是多个线程在同一时间开始执行内部run()方法。经过第一篇的学习,你应该能理解到,让线程能按我们的意志来运行其实是需要用一些手段(信号量、并发工具、线程池等)来实现的。常用的并发工具一般有CountD
2021-05-18 09:35:40
1417
原创 Java并发编程(一)如何保证线程顺序执行
只要了解过多线程,我们就知道线程开始的顺序跟执行的顺序是不一样的。如果只是创建三个线程然后执行,最后的执行顺序是不可预期的。这是因为在创建完线程之后,线程执行的开始时间取决于CPU何时分配时间片,线程可以看成是相对于的主线程的一个异步操作。public class FIFOThreadExample { public synchronized static void foo(String name) { System.out.print(name); } publ
2021-05-14 15:04:58
1989
1
翻译 [翻译]Java 8 并行流 – 自定义线程池示例
本篇是简单介绍如何自定义线程池并在Java 8 的Parallel Streams中使用线程池。并举例介绍如何不使用普通线程池而是使用自定义线程池来调用Parallel streams API。1. 介绍在本篇教程中,您将学习如何使用强大的并行流API(在Java8中)创建用于批量数据处理的自定义线程池。并行流可以在并发环境中运行,这是以多线程开销为代价的streams性能的改进版本。本文重点关注Stream API的最大限制并举例说明如何将并行流与自定义线程池结合使用。public class
2021-05-13 14:59:11
960
原创 每个产品经理都该懂点技术(二):接口文档的作用
两年前写了每个产品经理都该懂点技术的第一篇。我以为我能坚持写个七八篇这个系列的文章,结果两年过去了第二篇都没写完。其实并不是没写,而是自己对产品和技术之间的关系的理解确实浅薄。今天发表这篇主要是因为我没预料到第一篇能有将近5000的阅读(考虑到很多我认真写的技术文章阅读不过百,5000阅读数已经是我的人生巅峰了),其次是今年三月份有个读者评论让我续写。所以我就把之前写的这篇加上这两年的思考重新整理了一下。望各位喜欢。上一篇提到,前后端合作开发的时候需要用到接口文档。那么本篇就说说接口文档在产品中究竟有什
2020-11-12 14:57:43
826
原创 探索Java8:(四)DateTime API的使用
感谢千呼万唤始出来,探索Java8系列第四篇闪亮登场。探索Java8第一篇是2018年4月9号发布的,也就是说本篇距离探索Java8第一篇发布已经整整过去了两年半的时间。前三篇我发布到了简书、博客园、CSDN、掘金、SegmentFault,累计阅读量估计在10W左右。正是因为这个,所以我才有动力写下本系列的第四篇。非常感谢有这么多人阅读我的文章,如果对你有任何的帮助那真是我的荣幸。Java8中的一个新特性是就是对老旧的时间API的改进,Java8中引入了全新的DateTime API。分别为Loca
2020-11-09 17:40:30
177
原创 Cron表达式详解和表达式的验证
本篇不算原创,因为主要内容来自网上的博客,所以给出我参考文章的链接。本文cron表达式详解的大部分内容参考了[cron表达式详解]和Quartz使用总结、Cron表达式 这两篇文章。cron校验的内容参考了 判断cron表达式输入是否有效的正则表达式 和Verifying a cron expression is valid in Java 这两篇文章。一、表达式组成Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:Secon
2020-10-20 11:27:44
2972
原创 探索Java8:(三)Predicate接口的使用
上一篇学习了下Function接口的使用,本篇我们学习下另一个实用的函数式接口Predicate。Predicate的源码跟Function的很像,我们可以对比这两个来分析下。直接上Predicate的源码:public interface Predicate<T> { /** * Evaluates this predicate on the given argument. */ boolean test(T t); /** * Re
2020-10-16 09:08:51
302
原创 面试题:Java回形数组
最近遇到一个面试题。给定一个数字n,输出一个n阶矩阵。矩阵中的元素为1到n²。按回形排列eg1 :输入:n=2输出:1 24 3eg2:输入:n=3输出:1 2 38 9 47 6 5思路:这个题属于现实中遇到很简单,但是程序实现还是有些难度的问题。面试的时候面试官让我手写出这个问题的解法,无奈最后实在没写出来。纸上写代码太难了。这个问题其实需要分成三个层次去看。第一层看出来,此问题需要一个二维数组解决第二层看出来,此问题一个有四种操作数组的情况
2020-10-14 09:03:40
436
原创 探索Java8:(二)Function接口的使用
Java8 添加了一个新的特性Function,顾名思义这一定是一个函数式的操作。我们知道Java8的最大特性就是函数式接口。所有标注了@FunctionalInterface注解的接口都是函数式接口,具体来说,所有标注了该注解的接口都将能用在lambda表达式上。标注了@FunctionalInterface的接口有很多,但此篇我们主要讲Function,了解了Function其他的操作也就很容易理解了。@FunctionalInterfacepublic interface Function<
2020-10-12 16:09:06
463
原创 今后文章也要同步发到CSDN了
我的技术博客一直是发在简书、博客园和我的个人网站上面。曾经我也在CSDN上发表文章,但是后来因为口味不太符合后来就不在CSDN上发表了。今天重新登上CSDN发现上面的技术氛围和活跃度竟然比博客园和简书(简书真的是一手好牌打的稀烂)好很多。所以决定以后的文章要优先发到CSDN,但是简书和博客园我也会同步发表。欢迎评论区交流哦...
2020-10-12 15:30:12
830
原创 小工具:word表格文字转化成insert语句
群里的一个朋友有个需要,要让把word里的表格数据插入到数据库里面。我的思路是,把格式化的数据转成insert语句,然后去执行就可以了。要求的insert语句格式是:'insert into xxx values(“字段1”,“字段2”,“字段3”);"public class WordsProcessor { public static void main(String[] args) { String strings="Col1 Col2 Col3 Col4 Col5\r\n" +
2020-10-12 15:23:52
155
原创 探索Java8:Stream的使用
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行...
2018-04-10 13:55:24
371
原创 如何写出格式优美的javadoc?
如果你读过Java源码,那你应该已经见到了源码中优美的javadoc。在eclipse 中鼠标指向任何的公有方法都会显示出详细的描述,例如返回值、作用、异常类型等等。本文主要来自《Thinking in java》的内容以及我在工作中写javadoc的经验。三种类型的注释文档注释文档有三种类型,分别对应于注释位置后面的三种元素:类、域和方法。也就说类注释正好位于类定义之前;域注释位...
2018-02-23 23:16:45
1119
1
原创 《设计模式之禅》读书笔记(五)之代理模式
1. 代理模式的定义和应用1.1 代理模式的定义Provide a surrogate or placeholder for another object to control access to it .(为其他对象提供一种代理以控制对这个对象的访问)代理模式的类图如下:代理模式也叫做委托模式,是一种基本设计技巧。许多其他的模式,如状态模式、策略模式、访问者模式本质上是在
2018-02-05 14:28:10
204
原创 从一个审批需求看数据库设计——联合主键的使用
最近工作挺忙,已经接近996了,所以博客更新也少了。今天忙里偷闲,分享一个最近遇到的一个数据库设计问题。业务需求是: 针对一条人员信息的数据进行审批操作 在进行审批时要看到审批前后数据的修改 同一人员的审批数据只能存在一条 审批通过后数据在正式表中生效 审批通过后保存审批结果数据 业务逻辑本身并不复杂,我们可以建一个跟正式表完全相同的临时表来存储修改的数据,
2018-01-26 18:45:43
1707
翻译 「翻译」一篇redis文章引发的翻译——JVM能支持多少线程?
昨天看了一篇关于redis 的文。https://www.cnblogs.com/fanwencong/p/5782860.html作者说他模拟了100万线程的并发,我对这个有一些怀疑,看了评论也有很多质疑的声音。当然我这篇不是要批评作者对线程的模拟,事实上作者写的对redis的使用是很不错的,我们本篇主要针对个人电脑上的JVM最多能支持多少个线程。以下是StackOverflow上的一个
2018-01-12 14:27:33
322
原创 深入解析Java AtomicInteger 原子类型
在进行并发编程的时候我们需要确保程序在被多个线程并发访问时可以得到正确的结果,也就是实现线程安全。线程安全的定义如下: 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么这个类就是线程安全的。举个线程不安全的例子。假如我们想实现一个功能来统计网页访问量,你可能想到用count+
2018-01-06 23:38:16
4079
原创 ConcurrentHashMap——浅谈实现原理及源码
HashMap 在高并发下会出现链表环,从而导致程序出现死循环。高并发下避免HashMap 出问题的方法有两种。一是使用HashTable,二是使用Collections.syncronizedMap但是这两种方法的性能都能差。因为这两个在执行读写操作时都是将整个集合加锁,导致多个线程无法同时读写
2017-12-26 23:04:33
273
转载 浅谈HashMap 的底层原理
本文整理自漫画:什么是HashMap? -小灰的文章 。已获得作者授权。HashMap 是一个用于存储Key-Value 键值对的集合,每一个键值对也叫做Entry。这些个Entry 分散存储在一个数组当中,这个数组就是HashMap 的主干。 HashMap 数组每一个元素的初始值都是Null。 1. Put 方法的原理调用Put方法的时候发生了什么呢? 比如调用 hashMap.put(“
2017-12-24 23:28:14
15955
6
原创 如何在命令提示符下编译运行含有Package的java文件
这篇是大二自学Java的时候记下的笔记,中午回顾印象笔记的时候意外看到了这篇。看到多年前写下的文字,我想起那时候我对Java的懵懵懂懂,每天晚上在图书馆照着书写书上的示例代码,为一个中文分号绞尽脑汁,为命令提示符上打印出的图案而兴奋。到现在我依然觉得,一个从没有过编程经验的人在屏幕上打印出Hello World 的时候,他真的感觉是对一个全新的世界说了句“你好,我来了”。尽管现在来看那时候遇到的问题
2017-12-15 17:21:28
3579
1
原创 HashMap 遍历的两种方式及性能比较
HashMap 是Java开发中经常使用的数据结构。相信HashMap 的基本用法你已经很熟悉了。那么我们该如何遍历HashMap 呢?哪种遍历方式的性能更好呢?本篇文章来为你解决这个疑惑。一、HashMap 遍历如果你了解一些HashMap 底层原理,那么你肯定知道HashMap 是一个存储键值对的集合,每个键值对叫Entry。Entry 组成的数组构成了整个HashMap 的主干。Entry 的
2017-12-13 12:46:19
2946
1
原创 简单方法实现Form 无刷新提交表单
前几天遇到一个前端的问题。我希望提交表单后页面不跳转且不刷新当前页面,然而查了很多方法都没有解决。 由于Form 是提交后一定刷新页面的,所以我们可以用一个折中的办法。我们给Form 指定一个iframe,这样表单提交后刷新的就是我们指定的iframe 而不是页面了。iframe id="fraSubmit" name="fraSubmit" style="display:none;"
2017-12-12 15:25:25
2866
3
原创 [LeetCode]3. Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters.Examples:Given "abcabcbb", the answer is "abc", which the length is 3.Given "bbbbb", the answer is "b", with the le
2017-11-24 10:01:50
206
原创 《设计模式之禅》读书笔记(四)之抽象工厂模式
《设计模式之禅》读书笔记(四)之抽象工厂模式一、抽象工厂模式的定义 Provide an Interface for creating families of related or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。)抽象工厂模式的通用类
2017-11-20 22:50:40
271
原创 《设计模式之禅》读书笔记(二)之工厂方法模式
工厂方法模式的定义为: Define an interface for creating an object , but let subclass decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.
2017-11-16 14:43:38
252
原创 [LeetCode] 654. Maximum Binary Tree
Given an integer array with no duplicates. A maximum tree building on this array is defined as follow:The root is the maximum number in the array.
2017-11-13 14:54:34
232
原创 《设计模式之禅》读书笔记(一)——单例模式
单例模式是一个比较简单的模式,定义如下:Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例)1.饿汉式/** * * @Title: Singleton * @description: 单例模式-饿汉式 *
2017-11-13 14:44:10
201
原创 [javaScript]身份证号信息解析
之前一直在思考是不是该把工作中一些问题写出来(可能是简单的问题),现在的想法是应该写出来这些简单的问题。虽然工作中可能并没有很多特别难的问题让你去解决,因为公司的招人就是根据你的能力来匹配的嘛。简单的问题大部分都能从网上找到,比如数字校验的正则表达式、邮箱的校验、网址匹配的正则表达式等等。有时候我们遇到的问题并不是正好跟网上已有的完全一致,比如根据身份证显示出性别、出生年月、年龄的功能有不少,但
2017-11-13 14:44:05
1625
原创 Python学习笔记:与Java 基础语法对比
闲着无聊学习下Python 的语法。由于我目前主要编程语言还是Java ,所以针对Python 的学习我主要是通过与Java 进行对比。我使用的是Python3,因此语法上也会遵循Python3 的规则。简介Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年。像Perl语
2017-11-13 14:44:02
419
原创 每个产品经理都该懂点技术(一)——前后端做什么?
每个产品经理都应该懂点技术。当技术人员认为你提出的需求不能实现而怼你的时候,你可以从技术的角度将他正面击倒。而且熟悉一定的技术后,产品经理提出的需求将会更加合理,技术人员实现起来更容易。达到产品和技术和谐共处的美好社会。此篇文章是该系列的第一篇。产品经理每天需要跟技术人员打交道。有时候我们想知道,我提出的需求技术人员究竟能不能实现?要搞清楚这个问题,我们需要知道技术人员是怎么工作的,他们不同的
2017-11-13 14:43:59
3168
原创 Java Mail 邮件发送简单封装
上一篇文章我们用写了一个Java Mail 的Demo,相信你已经可以用那个例子来发送邮件了。但是Demo 有很多的问题。首先每次发送需要配置的东西很多,包括发件人的邮箱和密码、smtp服务器和SMTP端口号等信息。其次,没有将发送和邮件内容相分离。按照单一职责原则,应该有且仅有一个原因引起类的变更[^设计模式]。最后一个问题是,我们的代码不仅自己用,也很可能让别人调用。别人调用的时候不想去了解
2017-11-13 14:43:57
535
原创 Java Mail 邮件发送Demo
上周公司的项目要求开发邮件发送功能。自己在网上跟着教程边学边做了一下午,现在基本开发完成了。由于一个同事也想看下该怎么写,顺便学习下。所以我就写成了一遍教程,顺便巩固下邮件发送里面的内容。Demo第一步,我们先写个Demo,用最快的方式最少的代码向你展示Java Mail 是如何工作的。我的开发环境是:JDK1.6java-mail.jar 1.45构建一个简单的邮件发送,一共需
2017-11-13 14:43:54
295
原创 Win10下配置Java 环境变量
在Win10中配置环境变量的方法跟在Win8和Win7中有些不同,看了看网上好多还是Win7/8里面的配置方法。虽然从原理上基本上没什么问题,但有些细节却会让人很苦恼。特意整理下新的配置方法。我假定你已经正确安装了JDK和JRE。1. 配置JAVA_HOME首先打开环境变量的配置界面,新建一个系统环境变量:变量名:JAVA_HOME变量值:E:\JDK\JDK1.8其中变量值为你的
2017-11-13 14:43:51
276
原创 Java对map进行排序并生成序号
最近做的项目有这样一个需求:要求对map中的值进行排序并生成序号。如果值相等则序号不变;如果不相等序号为该数数值在所有元素中的索引。如下表所示:Key(String)Value(Float)Idx2312.41103.22112.2392.2311.9560.56public static Integer get
2017-11-13 14:43:49
2659
原创 [JavaScript]YYYY-MM-DD格式字符串计算年龄
function getAge(birth){ birth = birth.replace(/-/g,"/"); //把格式中的"-"替换为"/" birth = new Date(birth ); //替换后转为Date类型 var now = new Date(); //获取当前日期 var nowYear=now.getFullYear(); //当前日期的年
2017-11-13 14:43:44
1176
原创 MySQL中变量的用法——LeetCode 178. Rank Scores
Write a SQL query to rank scores. If there is a tie between two scores, both should have the same ranking. Note that after a tie, the next ranking number should be the next consecutive integer value.
2017-11-13 14:43:39
402
原创 LeetCode(476): Number Complement
Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation.Note:The given integer is guaranteed to fit within the range of a 32
2017-11-13 14:43:34
228
原创 树的层次遍历(Java代码实现)
与树的前中后序遍历的DFS思想不同,层次遍历用到的是BFS思想。一般DFS用递归去实现(也可以用栈实现),BFS需要用队列去实现。层次遍历的步骤是:1.对于不为空的结点,先把该结点加入到队列中2.从队中拿出结点,如果该结点的左右结点不为空,就分别把左右结点加入到队列中3.重复以上操作直到队列为空 1 public class Solution{ 2 class TreeNode
2017-11-13 14:43:29
5509
原创 解决使用eclipse创建maven web项目时报Could not resolve archetype的问题
前两天重装了系统,今天想写一个项目的时候出现了点问题。在使用eclipse创建maven web项目时,点Finish后报了Could not resolve archetype的问题。Could not resolve archetype org.apache.maven.archetypes:maven-archetype-webapp:1.0 from any of the confi
2017-11-13 14:43:24
1153
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人