查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

0与1构筑世界,程序员创造时代

软件架构设计 Java编程

 
 
 
 
 
 

广东省 广州市 处女座

 发消息  写留言

 
职    业 高级软件工程师
专长技能软件架构设计、Java编程
兴趣爱好: 编程、旅游、电影、音乐
喜欢名人毛泽东、邓小平、 朱镕基
人生格言宝剑锋从磨砺出, 梅花香自苦寒来!
博客等级加载中...
今日访问加载中...
总访问量加载中...
最后登录加载中...
 
 
 
 
 
 
 
心情随笔列表加载中...
 
 
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
 
 
 
 
网易云音乐 曲目表歌词秀
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

开源站点

 
 
模块内容加载中...
 
 
 
 
 
 
 
列表加载中...
 
 
 
 
 
 

我的个人网站

 
 
模块内容加载中...
 
 
 
 
 

免费/开源 软件

 
 
模块内容加载中...
 
 
 
 
 
 
 

多线程池执行异步任务

2014-3-31 21:34:34 阅读4676 评论13 312014/03 Mar31

在软件架构和设计中,会尽可能地将操作异步化,缩短响应时间,提升性能。

将异步任务放入线程池,这是许多人都知道的。但是当异步任务多了之后,如果全放在同一个线程池执行,会出现一些问题:

不同任务因其执行的操作不同,所需时间不同。如果有大量执行时间较久的异步任务,会阻塞那些执行非常快的异步任务,导致原本很快可以完成的异步任务也变慢。操作本地内容的异步任务和操作远程内容的异步任务。如果放在同一个线程池中,在网络出现故障的情况下,会出现大量的任务积压,导致执行本地内容的异步任务也受影响。

现实生活中,机动车行驶时,会根据行驶的速度划分超车道、快车道、慢车道和应急车道,避免速度慢的车辆阻塞速度快的车辆。

同理,将异步任务放入不同的线程池执行,就可以解决上面的两个问题。

threadpool4j是一个实现了多线程池的类库,使用方法如下:

1、获取threadpool4j源码。

git clone https://github.com/aofeng/threadpool4j

2、编译源码生成jar。

进入项目根目录,执行ant脚本:

ant

会生成一个dist目录,下面有两个文件。如:

threadpool4j-1.0.0-src.jar 源码jar threadpool4j-1.0.0.jar 用于发布的二进制jar

它的依赖类库在lib目录下。有common4j-.jar,log4j-1..jar。

作者  | 2014-3-31 21:34:34 | 阅读(4676) |评论(13) | 阅读全文>>

在JVM中编译脚本提升运行性能

2013-12-12 17:21:44 阅读800 评论0 122013/12 Dec12

JDK6增加了一个重要的特性,实现JSR 223规范支持脚本语言,使得Java可以通过脚本引擎执行JavaScript,Python等脚本语言代码。JDK6包含了一个基于Mozilla Rhino的 脚本语言引擎,支持JavaScript。其他的脚本语言可以按JSR 223规范实现脚本引擎,JDK中有一个ScriptEngineManager类,它可以通过jar服务发现(Service Discovery)机制寻找合适的脚本引擎类(ScriptEngine)。

脚本语言给人第一印象,它是逐行解释执行的,但JSR 223规范定义了脚本两种不同的运行方式:

解释运行。先编译,后运行。

是否支持编译功能,由具体的脚本引擎决定。JDK6自带的JavaScript引擎同时支持解释运行和编译运行两种方式,下面就对比这两种方式下脚本运行的性能。

代码

完整的源代码

1、解释运行。关键代码如下:

public void parse(String script, Map<String, Object> vars) throws ScriptException {

作者  | 2013-12-12 17:21:44 | 阅读(800) |评论(0) | 阅读全文>>

Java网络处理模型-非阻塞I/O+单线程

2013-10-26 21:24:53 阅读3439 评论2 262013/10 Oct26

"阻塞I/O+线程池"网络模型虽然比"阻塞I/O+多线程"网络模型在性能方面有提升,但这两种模型都存在一个共同的问题:面对大并发(持续大量连接同时请求)的场景,需要消耗大量的线程维持连接。CPU在大量的线程之间频繁切换,性能损耗很大。一旦单机的连接超过1万,甚至达到几万的时候,服务器的性能会急剧下降。

而NIO的Selector却很好地解决了这个问题,用“一个线程或者是CPU个数的线程”(主线程)hold住所有的连接,管理和读取客户端连接的数据,将读取的数据交给后面的线程池处理,线程池处理完业务逻辑后,将结果交给主线程发送响应给客户端,少量的线程就可以处理大量连接的请求。

单个线程hold住所有连接并处理请求和响应

代码示例

示例代码只实现一个线程负责所有的事务:接收请求,解析请求,业务逻辑处理,响应数据封闭,发送响应。

NioEchoServer.java 源代码:

package cn.aofeng.demo.nio;

import java.io.IOException;

作者  | 2013-10-26 21:24:53 | 阅读(3439) |评论(2) | 阅读全文>>

Java网络处理模型-阻塞I/O+线程池

2013-10-24 21:24:46 阅读1565 评论0 242013/10 Oct24

"阻塞I/O+线程池"网络模型是"阻塞I/O+多线程"网络模型的改进版,人们意识到每次有新连接创建和销毁线程的代价太大,就用线程池来解决这个问题:每次接收到新连接后从池中取一个空闲线程进行处理,处理完成后再放回池中,重用线程避免了频率地创建和销毁线程带来的开销。

和"阻塞I/O+多线程"相比,在大量短连接的场景中性能会有提升,因为不用每次都创建和销毁线程,而是重用连接池中的线程。但在大量长连接的场景中,因为线程被连接长期占用,不需要频繁地创建和销毁线程,因而没有什么优势。

代码示例

ThreadPoolEchoServer.java 源代码:

package cn.aofeng.demo.io;

import java.io.IOException;

import java.net.InetSocketAddress;

作者  | 2013-10-24 21:24:46 | 阅读(1565) |评论(0) | 阅读全文>>

Java实现在控制终端显示的字符进度条

2013-7-27 15:05:11 阅读5203 评论11 272013/07 July27

前言面向用户使用的程序都会考虑响应性,如:上传、下载文件会显示已经完成百分之多少,方便用户了解处理的进度。在Swing和AWT编写的应用有现成的进度条控件可用,但对于非界面程序就需要自己实现了。

花了点时间写了一个类似于wget的字符进度条,可用于在Linux的命令终端和Windows的命令窗口中实时显示任务处理的进度。

原理:

在每次显示进度条时将光标定位回当前行的最左边,输出当前的进度条覆盖旧的进度条。

特点:

在一行中实时显示进度和百分比,类似于wget的进度条

已知存在的问题:

1、在Eclipse的控制台显示不正常,每次刷新进度条时会换行。

2、当进度条的长度超过控制终端的显示区域时,每次刷新进度条时会换行。

进度条代码

package cn.aofeng.util;

import java.text.DecimalFormat;

/**

 * 控制台字符型进度条。

 * 

 * @author 傲风 <aofengblog@163.com>

 */

public class ConsoleProgressBar {

private long minimum = 0; // 进度条起始值

作者  | 2013-7-27 15:05:11 | 阅读(5203) |评论(11) | 阅读全文>>

公平、公理、正义,是建立在双方的实力差不多的情况下。在一些地方,天高皇帝远,警察(包括政府)的作用有限,面对许多情况无能为力(只要不搞出人命)... ... ...

下图:现场被打民工

谁纵容作贱我的农民工兄弟??愤怒!!!!!!!!!!!

江西省上饶市玉山县临湖镇上坂村,十月五日上午工地的生活车回来的时候和当地地痞的摩托车发生刮蹭,经过当地村干部调解,当时就赔了他们三千块。晚八点左右,他们三十多人分骑十几辆摩托车又带人来要钱,开口就是三万块,工人不给,便遭毒打。报案以后,派出所来了两名民警,但他们根本就制止不了事态的发展,分明就是摆设。共打伤工点民工五人,现在五人都在住院,我拍到的只是几个受了轻伤的工友。

伤者望汝林,今年六十二岁,目前正在住院。

警察基本上就是个摆设。

希望大家转发,谢谢!我替农民工兄弟在此谢谢大家了!!!拜托!

作者  | 2012-10-21 9:12:31 | 阅读(811) |评论(2) | 阅读全文>>

const 关键字在C语言中有点名不符实,用它修饰变量结果不是常量而是只读常量,#define定义的才是常量。可参考我的另外一篇文章《C - 编译错误:'XXX'的存储大小不是常量

const 修饰变量与数组

1、const 修饰变量。为只读变量,如修改在编译时会报错。

#include <stdio.h>

 #include <stdlib.h>

int main(int argc, char *argv[])

 {

     const int x = 1;

     x = 99;   // 编译报错 error: assignment of read-only variable ‘x’

return EXIT_SUCCESS

 }

2、const 修饰数组。为只读数组,如修改在编译时会报错。

#include <stdio.h>

 #include <stdlib.h>

int main(int argc, char *argv[])

作者  | 2012-8-25 22:19:50 | 阅读(1304) |评论(1) | 阅读全文>>

熟悉了面向对象的Java语言,因工作需要,转向PHP这种半面向对象半面向过程的语言时,发现一些面向对象的设计在PHP中行不通,只能采用变通的方式。现在学习Unix C编程,完全面向过程,让人更加痛苦。而且,前面的一些概念惯性,在学习C的过程中踩了不少陷井。关键字static就是其中一个。

Java中的static

在Java中,static关键字用来修饰方法,变量和代码块,称为静态方法,静态变量和静态代码块。

静态方法:独立于实例,可通过类名直接调用,不可抽象,必须被实现。不可访问实例中的变量和方法。静态变量:在JVM内存中只有一份拷贝,在类的加载过程中完成。可通过类名来调用。静态代码块:由JVM在加载类时执行,在一个JVM进程中只会执行一次。

C中的static

在C中,static关键字可以用来修饰方法和变量,称为静态方法和静态变量。

静态方法:方法只在当前文件中可见,起到模块解耦的作用。静态变量:变量存放在程序的全局存储区中,下一次调用时会保存着上一次的值;仅在自己的作用范围内可见,静态局部变量仅在当前方法可见,静态全局变量仅在当前文件可见。

1、静态局部变量。

1)保存上一次的值。

a.c 源文件:

#include <stdio.h>

 #include <stdlib.h>

void runLocalStaticVar(void)

 {

作者  | 2012-7-28 23:58:55 | 阅读(1716) |评论(0) | 阅读全文>>

在Java、PHP中,基本不需要考虑原码、反码、补码、有符号数、无符号数这些问题,但现在学习C,发现这些东西时时刻刻需要用到。再来温习一下这些最基础的知识。

环境 | Enviroment

操作系统:RedHat 5.7 64bit

GCC: 4.1.2

基础知识 | Basis

注:以下是以32位整数为例进行说明。

位:计算机的最小度量单位,也称比特(bit)。

字节:由8个二进制位组成。

原码 - 一个数本身的二进制形式。

反码 - 正数的反码与原码相同,负数的反码是将除符号位外的其余位求反

补码 - 正数的补码与原码相同,负数的补码是将除符号位外的其余位求反,再加1

例:

十进制数 8,其原码是 0000 0000 0000 0000 0000 0000 0000 1000

                     其反码是 0000 0000 0000 0000 0000 0000 0000 1000

              

作者  | 2012-7-19 23:02:40 | 阅读(812) |评论(1) | 阅读全文>>

环境 | Enviroment

操作系统:RedHat 5.7 64bit

GCC: 4.1.2

问题及解决方法  | Problem and solution

问题描述

示例代码:

const char *formatTime(time_t time){

    if (0 == time) {

        return "";

    }

const int TIME_SIZE = 20;

    static char result[TIME_SIZE];

    struct tm *timeStruct = localtime(&time);

    size_t len = strftime(result, TIME_SIZE, "%Y-%m-%d %H:%M:%S", timeStruct);

    if (0 == len) {

        fprintf(stderr, "execute function strftime fail");

作者  | 2012-6-15 20:03:36 | 阅读(1150) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 
 
日志评论
评论列表加载中...
 
 
 
 
 
博友列表加载中...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018

注册 登录  
 加关注