2015年6月7日
摘要:
推荐还是用第一种方法,即用timer并且在timer里面使用线程池。
1.timer中用线程池来执行任务,可以保证开始执行时间的准确,具体结束时间要以任务需要执行时间为准。如果未使用线程池,执行时间将被任务执行时间所影响。
package timer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
阅读全文
posted @ 2015-06-07 00:05
上校
阅读(1273)
推荐(0)
2015年6月1日
摘要:
原文:http://ifeve.com/synchronized-blocks/
Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容:
Java同步关键字(synchronzied)
实例方法同步
静态方法同步
实例方法中同步块
静态方法中同步块
Java同步示例
阅读全文
posted @ 2015-06-01 10:48
上校
阅读(1723)
推荐(0)
2015年5月31日
摘要:
浅拷贝:
package test;
class Student implements Cloneable {
private int number;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
阅读全文
posted @ 2015-05-31 21:38
上校
阅读(1545)
推荐(0)
2015年5月22日
摘要:
Runtime.getRuntime().addShutdownHook(shutdownHook);
这个方法的含义说明:
这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁等操作。
阅读全文
posted @ 2015-05-22 23:53
上校
阅读(5974)
推荐(0)
2015年3月13日
摘要:
原文:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM、GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率。但是调整GC是以个极为复杂的过程,由于各个程序具备不同的特点,如:web和GUI程序就有很大区别(Web可以适当的停顿,但GUI停顿是客户无法接受的),而且由于跑在各个机器上的配置不同(主要cup个数,内存不同),所以使用的GC种类也会不同(如何选择见GC种类及如何选择)。本文将注重介绍JVM、GC的一些重要参数的设置来提高系统的性能。
阅读全文
posted @ 2015-03-13 00:16
上校
阅读(1612)
推荐(0)
2015年3月7日
摘要:
-Xms8000M 初始化的堆大小
-Xmx8000M 堆的最大值
-XX:+HeapDumpOnOutOfMemoryError 堆溢出时Dump出当前内存堆转储快照以便事后分析
-XX:PermSize=10M 方法区(非堆)初始化大小
-XX:MaxPermSize=10M 方法区(非堆)最大值
-Xss2M 栈大小
阅读全文
posted @ 2015-03-07 22:26
上校
阅读(650)
推荐(0)
2015年1月12日
摘要:
UTF-8是Unicode的一种实现方式,也就是它的字节结构有特殊要求,所以我们说一个汉字的范围是0X4E00到0x9FA5,是指unicode值,至于放在utf-8的编码里去就是由三个字节来组织,所以可以看出unicode是给出一个字符的范围,定义了这个字是码值是多少,至于具体的实现方式可以有多种多样来实现。
UTF-8是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8最多可用到6个字节。
如表:
阅读全文
posted @ 2015-01-12 01:13
上校
阅读(1135)
推荐(0)
2015年1月11日
摘要:
/**
* 过滤掉超过3个字节的UTF8字符
* @param text
* @return
* @throws UnsupportedEncodingException
*/
public static String filterOffUtf8Mb4(String text) throws UnsupportedEncodingException {
byte[] bytes = text.getBytes("utf-8");
ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
int i = 0;
阅读全文
posted @ 2015-01-11 23:30
上校
阅读(3222)
推荐(1)
2015年1月10日
摘要:
public static void main(String[] args) {
long serverId = 65535;
System.out.println("ServerId:" + serverId);
long a1 = 0b11110001001000000;// 123456
// 11110001001000000
// 0000000000000000
System.out.println("顺序号,a1:" + a1);
long a2 = a1 16;
System.out.println("左移16位,a2:" + a2);
阅读全文
posted @ 2015-01-10 21:05
上校
阅读(419)
推荐(0)
2015年1月5日
摘要:
原文:http://www.infoq.com/cn/articles/netty-million-level-push-service-design-points
1. 背景
1.1. 话题来源
最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题。问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为如下几类:
Netty是否可以做推送服务器?
如果使用Netty开发推送服务,一个服务器最多可以支撑多少个客户端?
使用Netty开发推送服务遇到的各种技术问题。
由于咨询者众多,关注点也比较集中,我希望通过本文的案例分析和对推送服务设计要点的总结,帮助大家在实际工作中少走弯路。
阅读全文
posted @ 2015-01-05 19:13
上校
阅读(15143)
推荐(11)
摘要:
原文:http://my.oschina.net/leejun2005/blog/343353
目录[-]
1、问题:mysql 遇到某些中文插入异常
2、原因:此 utf8 非彼 utf8
3、解决方案
3.1 升级 mysql 版本,并将utf8字符集升级到utf8mb4
3.1.1 直接修改表结构
3.1.2 修改数据库默认配置
3.2 强行过滤掉生僻字符串
3.2.1 shell 过滤
阅读全文
posted @ 2015-01-05 16:44
上校
阅读(7554)
推荐(2)
2015年1月2日
摘要:
Ant是一个Apache基金会下的跨平台的构件工具,它可以实现项目的自动构建和部署等功能。在本文中,主要让读者熟悉怎样将Ant应用到Java项目中,让它简化构建和部署操作。
一. 安装与配置
下载地址:http://ant.apache.org/,在本文中下载的是1.7.0版本。解压到某个目录(例如E:"apache-ant-1.7.0),即可使用。
添加系统环境变量:ANT_HOME,该变量指向Ant解压后的根目录,在此为E:"apache-ant-1.7.0。
安装与配置完毕后,读者可以测试一下Ant是否可用,首先进入Ant的bin目录,运行命令ant –version,若安装和配置成功,则会显示Ant版本信息,如下图所示:
阅读全文
posted @ 2015-01-02 22:57
上校
阅读(314)
推荐(0)
2015年1月1日
摘要:
1.volatile最适用一个线程写,多个线程读的场合。
如果有多个线程并发写操作,仍然需要使用锁或者线程安全的容器或者原子变量来代替。(摘自Netty权威指南)
疑问:如果只是赋值的原子操作,是否可以多个线程写?
阅读全文
posted @ 2015-01-01 21:28
上校
阅读(7862)
推荐(0)
摘要:
Java并发编程:volatile关键字解析
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。
volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volatile关键字的场景。
阅读全文
posted @ 2015-01-01 15:13
上校
阅读(502)
推荐(0)
摘要:
CAS
CAS:Compare and Swap, 翻译成比较并交换。
java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。
本文先从CAS的应用说起,再深入原理解析。
阅读全文
posted @ 2015-01-01 00:43
上校
阅读(8900)
推荐(2)
2014年12月31日
摘要:
结论:一般情况下推荐使用enterSet的for循环(即以下的方法2),如果只是取key值可以使用keySet性能会更好。
因为keySet只取key,enterSet即取了key又取了value。
public static void main(String[] args) throws Exception {
ConcurrentHashMap r = new ConcurrentHashMap();
long size = 2000000;
// 方法1
for (long i = 0; i size; i++) {
r.put(i, new ReqPacket());
}
System.out.println("方法1开始执行数:" + r.size());
阅读全文
posted @ 2014-12-31 11:10
上校
阅读(892)
推荐(0)
2014年12月30日
摘要:
1. 阐述
对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多。理由是:entrySet方法一次拿到所有key和value的集合;而keySet拿到的只是key的集合,针对每个key,都要去Map中额外查找一次value,从而降低了总体效率。那么实际情况如何呢?
为了解遍历性能的真实差距,包括在遍历key+value、遍历key、遍历value等不同场景下的差异,我试着进行了一些对比测试。
2. 对比测试
一开始只进行了简单的测试,但结果却表明keySet的性能更好,这一点让我很是费解,不都说entrySet明显好于keySet吗?为了进一步地进行验证,于是采用了不同的测试数据进行更详细的对比测试。
2.1 测试数据
阅读全文
posted @ 2014-12-30 19:42
上校
阅读(1051)
推荐(0)
2014年12月25日
摘要:
将下面的语句复制粘贴可以一次性执行完,我已经测试过,没有问题!
MySql存储过程简单实例:
/********************* 创建表 *****************************/
delimiter //
DROP TABLE if exists test //
阅读全文
posted @ 2014-12-25 18:27
上校
阅读(56511)
推荐(2)
2014年12月24日
摘要:
结论:如果集合不是线程安全的话,在多线程情况下插入数据会出现数据丢失的问题。
Java代码
import java.util.ArrayList;
import java.util.List;
//实现Runnable接口的线程
public class HelloThread implements Runnable {
String name;
List v;
阅读全文
posted @ 2014-12-24 00:38
上校
阅读(3553)
推荐(0)
摘要:
原文:http://blog.csdn.net/ghsau/article/details/17609747
JDK5.0之前传统线程
Java线程(一):线程安全与不安全
Java线程(二):线程同步synchronized和volatile
Java线程(三):线程协作-生产者/消费者问题
Java线程(四):线程中断、线程让步、线程睡眠、线程合并
Java线程(五):Timer和TimerTask
阅读全文
posted @ 2014-12-24 00:03
上校
阅读(309)
推荐(0)
2014年12月20日
摘要:
线程池:
package com.mainserver;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.config.ServerConfig;
阅读全文
posted @ 2014-12-20 15:08
上校
阅读(2136)
推荐(0)
2014年12月11日
摘要:
同时开10个线程存入和取出100万的数据,结论如下:
DoubleBufferedQueue ConcurrentLinkedQueue ArrayBlockingQueue LinkedBlockingQueue
执行结果如下:
DoubleBufferedQueue入队时间:9510 出队时间:10771
DoubleBufferedQueue入队时间:8169 出队时间:9789
ConcurrentLinkedQueue入队时间:10557 出队时间:13716
ConcurrentLinkedQueue入队时间:25298 出队时间:25332
ArrayBlockingQueue入队时间:21080 出队时间:22025
ArrayBlockingQueue入队时间:17689 出队时间:19654
LinkedBlockingQueue入队时间:38236 出队时间:52555
LinkedBlockingQueue入队时间:30646 出队时间:38573
阅读全文
posted @ 2014-12-11 20:58
上校
阅读(8292)
推荐(0)
2014年12月10日
摘要:
作者:朱先忠编译 转自天极[url]http://dev.yesky.com/356/2578856.shtml[/url]
摘要 CVS很酷,但Subversion更酷。然而,如果你在使用Eclipse进行开发,那么你可能直到近来才能利用Subversion带来的优点。随着 Subclipse的发行,Subversion可能会最终在你的Eclipse IDE环境充分发挥其威力而压倒CVS。
一、SCM和Subversion简介
软件配置管理(SCM)是管理源码并保持其安全的良好艺术,它能实现源码与其他团队成员之间保持共享,并且能够对之加以保护。良好地利用SCM,你能够容易地跟踪软件的发行和新的开发分支;这样以来,可以更为容易地标识和修正发行产品中的错误。
阅读全文
posted @ 2014-12-10 12:36
上校
阅读(6715)
推荐(0)
2014年12月6日
摘要:
创建作业事件
CREATE DEFINER=`root`@`%` EVENT `e_move_loginLog` ON SCHEDULE EVERY 1 MONTH STARTS '2015-01-01 05:30:01' ON COMPLETION NOT PRESERVE ENABLE DO CALL sp_moveLoginRecord()
阅读全文
posted @ 2014-12-06 16:03
上校
阅读(1209)
推荐(1)
2014年12月4日
摘要:
在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。
注:什么叫线程安全?这个首先要明确。线程安全的类 ,指的是类内共享的全局变量的访问必须保证是不受多线程形式影响的。如果由于多线程的访问(比如修改、遍历、查看)而使这些变量结构被破坏或者针对这些变量操作的原子性被破坏,则这个类就不是线程安全的。
今天就聊聊这两种Queue,本文分为以下两个部分,用分割线分开:
阅读全文
posted @ 2014-12-04 14:20
上校
阅读(7514)
推荐(1)
2014年12月3日
摘要:
原文:http://ifeve.com/concurrency-semaphore/#more-14753
简介
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。很多年以来,我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是控制流量的红绿灯,比如XX马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶入XX马路,但是如果前一百辆中有五辆车已经离开了XX马路,那么后面就允许有5辆车驶入马路,这个例子里说的车就是线程,驶入马路就表示线程在执行,离开马路就表示线程执行完成,看见红灯就表示线程被阻塞,不能执行。
阅读全文
posted @ 2014-12-03 15:32
上校
阅读(544)
推荐(0)
2014年12月2日
摘要:
在服务器开发中 通常的做法是 把 逻辑处理线程和I/O处理线程分离。
逻辑处理线程:对接收的包进行逻辑处理。
I/0处理线程:网络数据的发送和接收,连接的建立和维护。
通常 逻辑处理线程和I/O处理线程是通过数据队列来交换数据,就是生产者--消费者模型。
这个数据队列是多个线程在共享,每次访问都需要加锁,因此如何减少 互斥/同步的开销就显得尤为重要。
解决方案:双缓冲队列
阅读全文
posted @ 2014-12-02 18:23
上校
阅读(1105)
推荐(0)
2014年11月27日
摘要:
作为开发人员,掌握开发环境下的调试技巧十分有必要。去年就想把关于Eclipse断点调试总结下了,由于对时间的掌控程度仍需极大提高,结果拖到今年才写了此篇博文。关于java调试技术还有很多,如Java Debug Interface等,依据具体项目的需要,还有很多值得去研究和学习的。该博文仅就Eclipse断点调试技巧做下总结,不足够的地方还请大牛们指点。
1 Debug视图
1.1 线程堆栈视图
阅读全文
posted @ 2014-11-27 22:28
上校
阅读(6579)
推荐(0)
2014年11月12日
摘要:
根据mysql手册,mysql的变量分为两种:系统变量和用户变量。但是在实际使用中,还会遇到诸如局部变量、会话变量等概念。根据个人感觉,mysql变量大体可以分为四种类型:
一、局部变量。
局部变量一般用在sql语句块中,比如存储过程的begin/end。其作用域仅限于该语句块,在该语句块执行完毕后,局部变量就消失了。
局部变量一般用declare来声明,可以使用default来说明默认值。
阅读全文
posted @ 2014-11-12 00:08
上校
阅读(19864)
推荐(1)
2014年11月7日
摘要:
1.执行拼接字符串sql语句
set @dbname='trickraft_14f.';
set @sql=CONCAT('SELECT * FROM ',@dbname,'Armforce');
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
阅读全文
posted @ 2014-11-07 17:35
上校
阅读(433)
推荐(0)