54chen Twitter Memo 2010-02-28

  • [RT计划]状态帝 : 春晚刚完,央视开始筹备315晚会啦,这将是央视又一创收大项,春晚是给钱让你上,315是给钱让你不上。 #
  • [RT计划]
    冷笑话 : 小张在国中教书,人长得高高帅帅的,但只要一紧张,讲话就会口吃。有一次月考监考时,他发现有一位学生低着头翻书找答案。小张气急败坏,指着作弊的学生大吼:“你、你、你、你、你、你竟敢作弊,给我站起来!”话一说完,立刻有六个学生站了起来。 #
  • RT: @blogkid: RT: @cydu: facebook hiphop-php已经开源了, 有将近50M源码,包括单元测试,近四十万行C++代码. http://github.com/facebook/hiphop-php #
  • 人人网中间层:实践篇 http://ugc.renren.com/2010/02/20/renren-ice/ #
  • 涛哥在人民网微博开博,第一句话是:同志们好,我是敏感词! #
  • [RT计划]张章: RT @snakeyi: 所谓色即是空是指,因为电压等于电流乘以电阻,故AV=AIR #
  • [RT计划]项伟: 地震前三大現象:1.井水異常;2.動物反應異常;3.專家出來辟謠... #
  • [RT计划]李希伟: 留学生在国外的高速公路出车祸了,连人带车翻下悬崖,交警赶到后向下喊话道: “How are you?” 留学生答:“I‘m fine,thank you!” 然后交警走了,留学生就死了。 #
  • RT @Fenng:Use HipHop Compiling WordPress http://wiki.github.com/facebook/hiphop-php/running-hiphop #
  • [RT计划]施兴涛: 据说现在阿姆斯特丹的妓女们都会说两句汉语:lingdaohao!youfapiao! #
  • [RT计划]许朝军: 人生有很多步,但关键的只有两三步 #
  • BUZZ通过gmail通知后续的RT和回复,完美解决了Twitter被截字的问题 #
  • [RT计划]状态帝 : 中国特色英文单词:Smilence(笑而不语),Democrazy(痴心妄想),Togayther(终成眷属),Freedamn(天朝网络自由),Shitizen(p民) #
  • [RT计划]状态帝 : 中国的反腐有效手段:1、夫妻反目;2、家中被盗;3、意外事故;4、情人举报;5、政治斗争;6、惊人之言;7、照片露富;8、网民诅咒! #
  • [RT计划]猫扑话题 : 生于1991年6月9日温哥华冬奥会女子1500米短道速滑决赛夺冠后的周洋,面对央视记者提问的夺冠感言是:“我终于能让我的爸爸妈妈生活得好了。” #
  • “异常” 这个在OO中常见的词,让结构化的“是”与“否”又多了一种莫名其妙的可能。 #
  • 择吉日开始下班后三千米长跑计划 #
  • [RT计划]项伟: 統計局官員稱10年來工資增幅均高於GDP... #
  • 深入研究BDB JAVA版本的操作 浅出研究优秀的导航条对用户的影响 #
  • [RT计划]状态帝 : 一说到落后,爱国者就说“我们国家只有60年历史”,一说到领先,爱国者就说“我们有5000年文明”。 #
  • [RT计划]蓝秋鹏: 网易新闻:支付宝上海研发中心惊现毒蛇,目前没有竞争对手宣称对此事件负责;多家支付公司对此事的态度是既不否认也不承认;百度宣称:这又是支付宝的一次自我炒作 #
  • [RT计划]猫扑话题 : 某官员说:“整治黄段子非一日之功!”这是我听过最黄的一个黄段子。 #
  • [RT计划]项伟: 溝通:上面有溝,下面通... #
  • nuclear BDB 的引擎第一版宣告跑通 #
  • nuclear目前不完全支持的引擎包括 mem ehcache mysql bdb #
  • @helldragon0719 具体开源的时间还没定 待有稳定版本会有开源的一天的 #
  • [RT计划]刘健: 2010中国劳动人口将到达顶峰; 人口红利要用完了 #
  • [RT计划]
    猫扑话题 : 要生活得漂亮,需要付出极大忍耐,一不抱怨,二不解释。 #
  • [RT计划]状态帝 : 麦当劳肯德基市场调查中的经典回复:有啥好调的,在哪上厕所不是上! #
  • [RT计划]项伟: 你要是現在還說你上網看黃色圖片你出門都不好意思和別人打招呼... #
  • [RT计划]王俊杰: 如今流行自拍然后不小心被传到了网上,短短几天兽兽都OUT了,北影张雅茹+成都工行女郑璇在网上被疯狂搜索下载。 #
  • [RT计划]陈康: 要不是因为她,我的钱包就找不回来了,没想到她在网上找到我:昨晚你把钱包忘在我那里了。——上人人网,找回你忘在那里的钱包。 #
  • 《自然》杂志就科研对Google的依存度问题调查了中国科学家。参加调查的700多人中超过3/4者表示Google是他们科研中的主要工具。 #
  • [RT计划]胡銥鑫: 新四害:丰田的底盘,开发商的楼盘,股市的大盘,前男友的硬盘 #
  • @162cm 兄弟行动迅速 恭喜恭喜! #
  • BT的GFW 干掉人家静态域名 搞得CSS js一个也没有 要干全干了好翻墙 #
  • http://fmn.xnimg.cn/fmn036/20100226/1100/p_main_d1Ru_2b9500020f872d0d.jpg 好大一只河蟹 #
  • http://hiphotos.baidu.com/%C0%CF%D7%D3%CA%C7%B6%AB%B3%A7%B5%C4%C8%CB/pic/item/b2c7e3598b54b3ee9d82047c.jpg?v=tbs #
  • 赵文卓 女儿的名字很cool #
  • [RT计划]状态帝 : 躲猫猫后又一力作:喝水死。 #
  • [RT计划]孙际: 车到山前必有路,有路丰田刹不住!“扯到胸前必有露,有露疯舔遮不住” #
  • @nshen121 RP这么好?还是公司福利? #
  • [RT计划]唐骏: 买不起房子先租,租不起大的,先租小的,租不起核心地带的,租稍偏远点的。轻装前行用全部时间和精力去强大自己。 #
  • [RT计划]徐亮: :新闻:去年26省市GDP增速超10% 总量超万亿省市14个。元宵再点栋楼庆祝下吧,如何? 血泪GDP ------ #
  • [RT计划]猫扑话题 : 最高人民法院、最高人民检察院等部门明确指出,亲朋好友之间“传播”淫秽信息一般不按犯罪处理,只能认为是个人品德、情趣不高! #

PHP-FPM配置sendmail支持PHP发信

当下常用的环境CentOS+nginx+php-fpm+mysql.

之前五四陈科学院曾有一文章是介绍环境的配置的,挖一挖水,链接在这里:

wordpress nginx php-cgi mysql在128m内存下的vps安装和优化手记[原创]

如果要使用mail功能,需要按如下步骤操作:

第一步、安装sendmail

yum install sendmail

第二步、启动sendmail

service sendmail start

第三步、设置为auto start

chkconfig sendmail on

第四步、修改php-fpm.conf:

搜索sendmail,去掉那一行两头的注释如下:

<value name="sendmail_path">/usr/sbin/sendmail -t -i</value>

第五步、php-fpm reload

分享一个固定时间自动更新svn的简单shell脚本

这是一个超级简单的脚本,旨在提醒观众:在crontab最小精度只能到1分钟的情况下,可以使用这个作到1秒钟的间隔执行时间。

看代码:

#!/bin/sh
while true
do
/usr/bin/svn up /data/web/club/ #(指定的要更新的目录)
sleep 5
done
原理很简单,利用shell中sleep的单位为秒作自动执行,如果要更加小的精度,估计可以利用这个基础之上多个同时执行:) 仅猜想,标准一些的作法还是用java或者是php的sleep(毫秒级的)。

54chen Twitter Memo 2010-02-21

用java操作bdb的方法记录二

在科学院之前的一篇文章中,介绍过普通的操作BDB的方法,见:

java使用bdb手记(Berkeley DB Java api记录)

下文记录的是利用BDB的事务来完成的一个put和一个get方法的代码。其速度与原始的操作方法相当。

================================================代码段==============================

/**
* @author zhen.chen
* @createTime 2010-2-20 上午10:43:31
*/
package com.renren.nuclear.storage;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import com.sleepycat.je.Cursor;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;
import com.sleepycat.je.Transaction;

public class Test {
private static Environment env;
private static Database db;
private static long cacheSize = 1000 * 1024 * 1024;
private static String path = "./bdb/";

public static void main(String[] args) {
EnvironmentConfig envConfig = new EnvironmentConfig();
envConfig.setTransactional(true);
envConfig.setAllowCreate(true);
envConfig.setCacheSize(cacheSize);
try {
env = new Environment(new File(path), envConfig);
} catch (DatabaseException e) {

}
open("nuclear");

//写入
put("aa","aaa");

//取出
get("aa");

}

/**
* 写入操作
* @author www.54chen.com
* @createTime 2010-2-20 上午11:04:43
*/
public static void put(String key, String value){
// open("nuclear");
byte[] theKey = key.getBytes();
byte[] theValue = value.getBytes();
OperationStatus status = null;
Transaction transaction = null;
Cursor cursor = null;
boolean succeeded = false;
try {
transaction = env.beginTransaction(null, null);
cursor = db.openCursor(transaction, null);
status = cursor.put(new DatabaseEntry(theKey), new DatabaseEntry(theValue));
if (status != OperationStatus.SUCCESS){
// TODO
}

succeeded = true;
} catch (DatabaseException e) {

} finally {
attemptClose(cursor);
if (succeeded)
attemptCommit(transaction);
else
attemptAbort(transaction);
} }

/**
* 取出操作
* @author www.54chen.com
* @createTime 2010-2-20 上午11:04:51
*/
public static List<String> get(String key){
ArrayList<String> nuclearStorageValue = new ArrayList<String>();

DatabaseEntry queryKey = new DatabaseEntry();
DatabaseEntry value = new DatabaseEntry();
queryKey.setData(key.getBytes());
Cursor cursor = null;
try {
cursor = db.openCursor(null, null);
for(OperationStatus status = cursor.getSearchKey(queryKey, value, LockMode.READ_UNCOMMITTED); status == OperationStatus.SUCCESS; status = cursor.getNextDup(queryKey,value,LockMode.RMW)) {
nuclearStorageValue.add(value.getData().toString());
} } catch (DatabaseException e) {

} finally {
attemptClose(cursor);
} return nuclearStorageValue;
}

/**
* 打开DB
* @author www.54chen.com
* @createTime 2010-2-20 上午11:01:48
*/
private static void open(String dbName) {
DatabaseConfig dbConfig = new DatabaseConfig();
dbConfig.setAllowCreate(true);
dbConfig.setTransactional(true);
try {
db = env.openDatabase(null, dbName, dbConfig);
} catch (DatabaseException e) {
e.printStackTrace();
} }

private static void attemptClose(Cursor cursor) {
try {
if (cursor != null)
cursor.close();
} catch (DatabaseException e) {
// TODO logger
} }

private static void attemptCommit(Transaction transaction) {
try {
transaction.commit();
} catch (DatabaseException e) {
attemptAbort(transaction);
// TODO logger
} }

private static void attemptAbort(Transaction transaction) {
try {
transaction.abort();
} catch (Exception e) {
// TODO logger
} }
}

============================================代码结束==================================

代码是用游标操作bdb的例子,在使用的时候可以在其基础上继续进一步修改。

PS:人人网Nuclear系统的BDB引擎将可能会使用这样的操作方法,目前我还在做速度上的调优,待有新的结果将第一时间公布给大家。

54chen Twitter Memo 2010-02-14

  • [RT计划]猫扑话题 : 聪明人有脑,傻子有种... #
  • [RT计划]冷笑话 : 晚上去吃麻辣烫,挑的正高兴,一MM突然在身后问:"请问哪个是生菜?"我说:"没下锅前它们都是啊。。。" #
  • [RT计划]冷笑话 : 小灰狼天生喜欢吃素,大灰狼父母为此很是着急,但也无能为力。一日,见小灰狼疯狂追捕一只小白兔,二大狼心中大喜,以为其恢复野性。谁知,小灰狼上前一把扑住小白兔说:“兔兔,把胡萝卜给我交出来!” #
  • [RT计划]状态帝 : 夏日玉凤冬日娜,暮观阿娇晨观曦,月会翁虹周会敏,文疼子美武藤兰,早上雯婕迟上斌,难见刘翔易见联,首吻丞琳末吻蔚,外遇芙蓉里遇春,唐祖李渊宋祖德,爷上人人孙上香! #
  • [RT计划]Dr.李黎§Hyde: 信舅舅我他妈还不如信春哥,你们这帮运营商,关门放舅舅这一招,已经使得出神入化了。你们扯起理由来,就像国足那帮废物!要么草皮太干,要么草皮太湿,要么草皮不干不湿。当初信你们网毅真是瞎了我的氪金狗眼! #
  • [RT计划]猫扑话题 : 去家乐福购物。碰到凤姐给你收银怎么办呀? #
  • 人人网联手激动网打造春晚网络直播 http://tech.qianlong.com/33443/2010/02/08/71@5501357.htm #
  • [RT计划]陈蕾: 据报道 滞留 广州火车站的60万务工者开始从广州集体步行 他们组成 湖北团、安徽团、四川团等等军团 准备向大自然发起挑战!步行回家过年!!据估计 这一长征将需要4个月时间 中央领导获悉后 决定将5月1日更改为春节 好让大家能及时过上年 #
  • [RT计划]冷笑话 : 一男人总找不到女朋友,无奈就去算命.算命大师说:你,前半生注定没女人;那人眼睛一亮:那我后半生应该有吧? 算命师说:哎,到了后半生你就习惯了一个人的生活....... #
  • [RT计划]谷禹: Calvin Klein的女儿曾抱怨,她最扫兴的就是她跟男朋友亲热的时候,看到她爸的名字出现在内裤的边缘。 #
  • [RT计划]状态帝 : “一炮而红”是很多电影学院女学生的梦想,也是每个男人和女友初次上床前的梦想。 #
  • [RT计划]王志亮: “干什么都离不开专业两字,所谓专业,professional,其拉丁文词根最早的意思是妓女。所以专业意思是:哪怕不享受,也要闭着眼去干。” #

解读PHP开源项目中列表和hook方法:while(has_items()): Thme_ite();和apply_filters

wordpress,lilina等开源项目中,常常会看到一些莫名的代码,来无影去无踪,看上去很有意味,特地拿来分析分析,看看一般的作法。

part 1  列表 循环显示

先看代码:

<?php
$num = 0;
if(has_items()) {
while(has_items()): the_item();
} ?>
以上代码,出自某开源项目。。。

再进入the_item()函数内部,可以看到一个关键的函数:

* Returns the current item
* * @since 1.0
* * @return bool|stdClass False if item doesn't exist, otherwise returns the specified item
*/
public function current_item() {
$this->previous_item = $this->current_item;
$this->current_item = '';

$item = each($this->items);
$item = $item['value'];
if(!$item)
return false;

$this->current_item = $item;
$this->current_feed = $item->feed;

return $item;
} 这个关键的函数是each(),来看手册:

each

(PHP 3, PHP 4, PHP 5)

each --  返回数组中当前的键/值对并将数组指针向前移动一步

说明

array each ( array &array )

返回 array 数组中当前指针位置的键/值对并向前移动数组指针。键值对被返回为四个单元的数组,键名为 01keyvalue。单元 0key 包含有数组单元的键名,1value 包含有数据。

如果内部指针越过了数组的末端,则 each() 返回 FALSE

综合来看,其实就是一个做了一个游标一样的模型,利用each来操作一个数组或者相似的结构,每次在显示的时候,都有对数据数组的本身操作,而while里的has_item,只是作简单的判断有无而已。

part2 hook

第二种情况,是一个叫apply_filters的函数的实现。先看代码:

function the_item() {
global $lilina_items, $item;

$item = apply_filters('the_item', $lilina_items->current_item());
} 这是lilina里的一个函数,要看的是这个apply_filters方法,有一个简单的例子:

function example_hook($string, $arg1, $arg2)
{ //Do stuff
return $string;
} $value = apply_filters('example_hook', 'filter me', 'arg1', 'arg2');
apply_filters里面最关键的一个函数:

call_user_func_array

(PHP 4 >= 4.0.4, PHP 5)

call_user_func_array --  Call a user function given with an array of parameters

Description

mixed call_user_func_array ( callback function, array param_arr )

Call a user defined function given by function, with the parameters in param_arr.

其实这些渐渐被遗忘的函数,在高手们的使用下,对项目化的开发很有优势,随手记之。

54chen Twitter Memo 2010-02-07

  • 深圳火车站1月30日的一趟列车,上座率仅8%,然而根据铁路部门发布的信息,这趟列车的车票早已售罄。深圳火车站官员表示,发车时段不集中,900多名旅客错过了乘车的原因可能是请不到假。 #
  • 状态帝 : 曾经的梦中情人:皮肤白皙,知性,善交际,套穿白色长裙,披肩长发,大波浪。——10 年后,我找到了梦中情人:皮肤白皙,知性善交,忌套,穿白色长裙,披肩长发,大波,浪。 #
  • 转自吴铭锐: 转:这个twitter客户端无比强大! http://acm.buaa.edu.cn/admin/ 当时我就震惊了! #
  • 转自乾鹏: ipad 解决了ipod touch以及其他的所有的移动设备都没法解决的一个大问题,那就是再也不会掉进厕所 #
  • 即日起正式开转人人网优秀状态进推特与大家分享[RT计划]R=renren T=twitter 每天五到十条,留名推荐 #
  • RT:@Fenng: NoSQL 新解,NoSQL = Not Only SQL //其实dynamo之类的系统里,SQL是个介质,因为DB效率不够,所以把负载放到业务逻辑上来,NoSQL可以很可计量地将存储的性能保持稳定,而不是因为sql条件的不同执行的时间不同 #
  • [RT计划]状态帝 : 焦台长对小虎队春晚重聚献唱旧歌《爱》做了入木三分的评价,帝深深感到: 姓焦的果然不懂什么叫做爱! #
  • [RT计划]郭锐:新版优酷的伟大在于,你想看一15秒的视频片段,他会让你先看个30秒的广告。。。 #
  • [RT计划]
    状态帝 : 小时候/低俗是一盘小小的磁带 /我在这头/ 丽君在那头;后来啊/ 低俗是一团窄窄的纸条 /我在后头/ 女生在前头;长大后/ 低俗是一张薄薄的光盘 /我在这头/ 电视在那头; 而现在/ 低俗是一条短短的信息 /我在里头/ 警察在外头。 #
  • 人人网UGC团队博客更新:文本分析漫谈-分类器中的关键词提取 讲述我们所使用的数据挖掘知识 http://ugc.renren.com/2010/02/01/keywords-extraction-overview/ #
  • 年会三天乐结束,RT计划重新开始! #
  • [RT计划]状态帝 : 朝鲜已经确立以金正银(朝鲜领导人金正日第三子)为中心的、唯一的领导体制。明年起金正银的生日,即是1月8日,将被定位国定假日。 #
  • [RT计划]blogtd: 乡愁是一列请不到假的火车厢,8%在里头,92%在外头。 #
  • [RT计划]戴文哲: 白岩松:今年我们去美国去看新闻博物馆,在博物馆里头有一个触目惊心的东西,它是2001月9月12日那天各个国家报纸的头版,所有的头版都是9·11,只有我们的是领导的接见。 #
  • [RT]猫扑话题: 据科学杂志显示,女性的感情变化可以分为1019类。男的情绪就两类,第一类是:哼哼,牛逼了!第二类是:草,傻逼了! #
  • [RT计划]杨晨: 网友真是很赞啊,三聚氰胺复出,被立即命名为“添胺门” #
  • [RT计划]状态帝 : 为什么天底下最难搞的关系是婆媳关系?1.媳妇的别称是“新娘”,一个新的娘突然来到家里,旧的娘心里能好受吗?2.婆婆用了五年的时间教会儿子穿衣服,媳妇用不到五秒钟就能让儿子把衣服脱光,这是一种怎样的心理落差? #
  • [RT计划]韩煜尘: 今天早上坐地铁,人多特别挤! 旁边有一个女孩子长得非常卡哇伊正在发短信,我无意看了一眼发现她写道“今天车上人很多,很挤” 一会儿我想起个事自己笑了几声。一会儿无意回头一看,看到这个女孩继续写道“旁边还站着一个 S B ” #
  • [RT计划]韩寒:各位领导,老师,同学大家好,中国为什么成为不了文化大国?因为讲话时各位领导永远放在第一位。领导都没有文化。他们还惧怕文化,审查文化,又控制文化,这个国家怎能成为文化大国?各位领导你们说呢? #
  • [RT计划]袁涛: 丰胸的四种结果:1、大不一样 2、不大一样 3、一样不大 4、不一样大 #
  • [RT计划]劉哲宇の介: 我想有一所房子,面朝大海,春暖花开,4M宽带,能叫外卖,快递直达,不还房贷 #
  • [RT计划]康伟.kw: 制作传播20个成人淫秽信息构成犯罪。制作传播10个未成年人淫秽信息构成犯罪。所以我们最多制作19个成人淫秽信息,9个未成年人淫秽信息就可以了。 #
  • [RT计划]张章: People who are zhuangbility want to show their niubility but only reflect their shability. #
  • [RT计划]许朝军: 要想不被日趋迅速和激烈的竞争甩在身后,稳定速度从来就不是正确的速率。 #
  • [RT计划]汪祖方: 国家计生委官员表示,中国的计划生育政策不是强迫性的,人们是在自愿的基础上实施计划生育的。与发达国家相比,中国育龄妇女的人工流产率与美国基本接近,中国是28%,美国是25%。 #
  • [RT计划]状态帝 : 佳丽家里想男人难忍,和尚河上见师太失态 #
  • [RT计划]林庆霖HoHo™: 楼主:月薪1200元,买什么车好?一楼:买副象棋吧,有四个车,还送四个宝马! #
  • 有关部门要求 周六以前 网站必须变得喜庆 #
  • 哥还是有先见之明,早在上周就上年了虎年新版,上级部门通知大家喜庆更新的时候,乐了。http://news.163.com http://www.54chen.com 这虎头咋长一个样 #

Java线程控制器代码分享-根据cpu情况决定线程运行数量和情况

人人网海量存储系统的存储引擎部分,为了提高CPU和网络的使用情况,使用了java多线程管理并行操作的方式。

在java中控制线程是一件很简单的事情,jdk提供了诸多的方法,其中比常用的两个是notify()和wait(),一个是唤醒,一个等待线程,在下面的代码中,将看到一个线程分配器,根据cpu的负载情况,自动完成对应线程的唤醒或者是等待操作。整个过程是一个平滑的过程,不会因为线程的切换而导致机器负载出线锯齿。

先看一个类,读取Linux系统TOP等指令拿到系统当前负载:

import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
* 节点的cpu 内存 磁盘空间 情况
* * @author zhen.chen
* */
public class NodeLoadView {

/**
* 获取cpu使用情况
* * @return
* @throws Exception
*/
public double getCpuUsage() throws Exception {
double cpuUsed = 0;

Runtime rt = Runtime.getRuntime();
Process p = rt.exec("/usr/bin/uptime");// 调用系统的“top"命令
String[] strArray = null;
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String str = null;
while ((str = in.readLine()) != null) {
strArray = str.split("load average: ");
strArray = strArray[1].split(",");
cpuUsed = Double.parseDouble(strArray[0]);
} } catch (Exception e) {
e.printStackTrace();
} finally {
in.close();
} return cpuUsed;
}

/**
* 内存监控
* * @return
* @throws Exception
*/
public double getMemUsage() throws Exception {

double menUsed = 0;
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("top -b -n 1");// 调用系统的“top"命令

BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String str = null;
String[] strArray = null;

while ((str = in.readLine()) != null) {
int m = 0;

if (str.indexOf(" R ") != -1) {// 只分析正在运行的进程,top进程本身除外 &&
//
// System.out.println("------------------3-----------------");
strArray = str.split(" ");
for (String tmp : strArray) {
if (tmp.trim().length() == 0)
continue;

if (++m == 10) {
// 9)--第10列为mem的使用百分比(RedHat 9)

menUsed += Double.parseDouble(tmp);

}
}

}
} } catch (Exception e) {
e.printStackTrace();
} finally {
in.close();
} return menUsed;
}

/**
* 获取磁盘空间大小
* * @return
* @throws Exception
*/
public double getDeskUsage() throws Exception {
double totalHD = 0;
double usedHD = 0;
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("df -hl");// df -hl 查看硬盘空间

BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String str = null;
String[] strArray = null;
while ((str = in.readLine()) != null) {
int m = 0;
// if (flag > 0) {
// flag++;
strArray = str.split(" ");
for (String tmp : strArray) {
if (tmp.trim().length() == 0)
continue;
++m;
// System.out.println("----tmp----" + tmp);
if (tmp.indexOf("G") != -1) {
if (m == 2) {
// System.out.println("---G----" + tmp);
if (!tmp.equals("") && !tmp.equals("0"))
totalHD += Double.parseDouble(tmp.substring(0,
tmp.length() - 1)) * 1024;

}
if (m == 3) {
// System.out.println("---G----" + tmp);
if (!tmp.equals("none") && !tmp.equals("0"))
usedHD += Double.parseDouble(tmp.substring(0,
tmp.length() - 1)) * 1024;

}
} if (tmp.indexOf("M") != -1) {
if (m == 2) {
// System.out.println("---M---" + tmp);
if (!tmp.equals("") && !tmp.equals("0"))
totalHD += Double.parseDouble(tmp.substring(0,
tmp.length() - 1));

}
if (m == 3) {
// System.out.println("---M---" + tmp);
if (!tmp.equals("none") && !tmp.equals("0"))
usedHD += Double.parseDouble(tmp.substring(0,
tmp.length() - 1));
// System.out.println("----3----" + usedHD);
} }

}

// }
} } catch (Exception e) {
e.printStackTrace();
} finally {
in.close();
} return (usedHD / totalHD) * 100;
} //
//    public static void main(String[] args) throws Exception {
//        NodeLoadView cpu = new NodeLoadView();
//        System.out
//                .println("---------------cpu used:" + cpu.getCpuUsage() + "%");
//        System.out
//                .println("---------------mem used:" + cpu.getMemUsage() + "%");
//        System.out
//                .println("---------------HD used:" + cpu.getDeskUsage() + "%");
//        System.out.println("------------jvm监控----------------------");
//        Runtime lRuntime = Runtime.getRuntime();
//        System.out.println("--------------Free Momery:" + lRuntime.freeMemory()
//                + "K");
//        System.out.println("--------------Max Momery:" + lRuntime.maxMemory()
//                + "K");
//        System.out.println("--------------Total Momery:"
//                + lRuntime.totalMemory() + "K");
//        System.out.println("---------------Available Processors :"
//                + lRuntime.availableProcessors());
//    }
} 再来看关键的一个类,THreadScheduler:

import java.util.Map;

import org.apache.log4j.Logger;

import test.NodeLoadView;
public class ThreadScheduler {
private static Logger logger = Logger.getLogger(ThreadScheduler.class.getName());
private Map<String, Thread> runningThreadMap;
private Map<String, Thread> waitingThreadMap;
private boolean isFinished = false;
private int runningSize;

public ThreadScheduler (Map<String, Thread> runningThreadMap, Map<String, Thread> waitingThreadMap) {
this.runningThreadMap = runningThreadMap;
this.waitingThreadMap = waitingThreadMap;
this.runningSize = waitingThreadMap.size();
}

/**
* 开始调度线程
* @author zhen.chen
* @createTime 2010-1-28 上午11:04:52
*/
public void schedule(){
long sleepMilliSecond = 1 * 1000;
int allowRunThreads = 15;
// 一次启动的线程数,cpuLoad变大时以此值为参考递减
int allowRunThreadsRef = 15;
double cpuLoad = 0;// 0-15
NodeLoadView load = new NodeLoadView();

while (true) {
try {
cpuLoad = load.getCpuUsage();
} catch (Exception e1) {
e1.printStackTrace();
} // cpuLoad低 启动的线程多
allowRunThreads = (int) Math.floor(allowRunThreadsRef - cpuLoad);
// threads不能为0
if (allowRunThreads < 1) {
allowRunThreads = 1;
} if (allowRunThreads > allowRunThreadsRef) {
allowRunThreads = allowRunThreadsRef;
} if (logger.isDebugEnabled()) {
logger.debug("[ThreadScheduler]running Thread:" + runningThreadMap.size() + "; waiting Thread:" + waitingThreadMap.size() + "; cpu:" + cpuLoad + " allowRunThreads:" + allowRunThreads);
}

// 检查runningSize个线程的情况,满足条件则启动
for (int x = 0; x < runningSize; x++) {
if (waitingThreadMap.get(x+"") != null) {
if (allowRunThreadsRef <= runningThreadMap.size()) {
break;
} synchronized (waitingThreadMap.get(x+"")) {
if (!waitingThreadMap.get(x+"").isAlive()) {
waitingThreadMap.get(x+"").start();
}else{
waitingThreadMap.get(x+"").notify();
} }
runningThreadMap.put(x+"", waitingThreadMap.get(x+""));
waitingThreadMap.remove(x+"");
} }
// 检查runningSize个线程的情况,满足条件则暂停
for (int x = 0; x < runningSize; x++) {
if (runningThreadMap.size() <= allowRunThreads) {
break;
} if (runningThreadMap.get(x+"") != null) {
synchronized (runningThreadMap.get(x+"")) {
try {
if (runningThreadMap.get(x+"").isAlive()) {
runningThreadMap.get(x+"").wait();
}else{
continue;
} } catch (InterruptedException e) {
e.printStackTrace();
} }
waitingThreadMap.put(x+"", runningThreadMap.get(x));
runningThreadMap.remove(x+"");
} }
// 全部跑完,返回
if (waitingThreadMap.size() == 0 && runningThreadMap.size() == 0) {
if (logger.isDebugEnabled()) {
logger.debug("[ThreadScheduler] over.total Threads size:" + runningSize);
} this.isFinished = true;
return;
} // 使主while循环慢一点
try {
Thread.sleep(sleepMilliSecond);
} catch (InterruptedException e1) {
e1.printStackTrace();
} }

}

public boolean isFinished() {
return isFinished;
} } 这个类的作用:

1.接收runningThreadMap和waitingThreadMap两个map,里面对应存了运行中的线程实例和等待中的线程实例。

2.读cpu情况,自动判断要notify等待中的线程还是wait运行中的线程。

3.两个map都结束,退出。(必须runningThreadMap内部的Thread自己将runningThreadMap对应的Thread remove掉)

如何使用:

public class TestThread {
public static class Runner extends Thread {
public Runner(int j, Map<String, Thread> threadMap) {

}
public void run() {
// TODO 你的逻辑 完成后需要从threadMap中remove掉
} }

public static void main(String[] args) {
// 运行中的线程
Map<String, Thread> threadMap = new HashMap<String, Thread>();
// 正在等待中的线程
Map<String, Thread> waitThreadMap = new HashMap<String, Thread>();
for (int j = 0; j < args.length; j++) {
Thread t = new Runner(j, threadMap);
waitThreadMap.put(j + "", t);
}

ThreadScheduler threadScheduler = new ThreadScheduler(threadMap, waitThreadMap);
threadScheduler.schedule();
if (threadScheduler.isFinished() == false) {
//没能正常结束
} }
}

54chen Twitter Memo 2010-01-31

  • 工信部驳斥“中国政府参与黑客攻击”说 #
  • 先秦诸子召开电影《孔子》座谈会。老子首先发言:圣人之道,为而不争,小孔这次大失风度。墨子接着发言:反天意者必得罚,我看票房会很惨。孟子附和:得道多助,失道寡助,我同意老墨看法。庄子一摇鹅毛扇:至人无己,神人无功,圣人无名,老孔拍电影本身就傻逼。孔子跌坐于地:靠,三人行没一个买票 #
  • 人人网UGC技术团队博客 http://ugc.renren.com 向各大互联网兄弟公司博客招友情链接,共同学习,共同成长。 #
  • 2.3亿汶川灾后重建资金被违规使用 这些没有良知的蛀虫! #
  • LuWenBin :敏感词进化史:我爱北京天安门--》 我爱北京敏感词--》我爱敏感词敏感词--》我敏感词敏感词敏感词--》对不起,该页无法显示。 #
  • 人人网UGC海量存储系统Nuclear介绍 – 原理展望篇 http://ugc.renren.com/2010/01/28/ugc-nuclear-guide-theory/ 第二篇 横空出世 欢迎指点 #