Wednesday, September 23, 2009

回龙观的彩虹

在回龙观公园春游时拍的,今天翻照片的时候看到了,非常赞!

Tuesday, August 25, 2009

又一个乐高玩具

儿子的生日礼物,胜利完成:


Wednesday, August 12, 2009

外接显示器的分辨率在Ubuntu 9.04下终于正常了

自从升级到Ubuntu 9.04之后,外接显示器一直都只能运行在1280x1024下,尽管实际的最高分辨率是1680x1050。上网搜了一下并尝试了如下命令:
sudo dpkg-reconfigure -phigh xserver-xorg

重启动X之后,一切正常!终于不用看模糊的屏幕了,感动!

Friday, June 05, 2009

搭积木:一个乐高的汽车

乐高的积木挺好玩的,跟儿子一起玩了一个小时才搞定:

Tuesday, April 28, 2009

在Eclipse下导入已有的git仓库中的项目

让Eclipse和Git一起工作是一件容易的事情。首先,从http://git.or.cz/gitwiki/EclipsePlugin下载Eclipse的插件。这个插件能够让Eclipse和Git一起工作,其结构非常简单。插件的作者并未遵循Eclipse的规范,相反,Git对应的菜单被生硬的插入到了Eclipse的UI中。估摸插件的作者对于Eclipse插件的高度灵活性和可配置性不感冒吧,不管怎么样,够用就行了。

这个插件自动华程度不高。首先,我们需要用git clone将远端的git仓库复制到本地。然后在Eclipse中,通过菜单File| Import... | Existing Projects into Workspace来导入本地仓库中的Eclipse项目。注意不要勾选“Copy projects into workspace”。当项目导入之后,在项目的上下文菜单中选择Team| Share...| Git项,然后一路Next即可。

Wednesday, April 15, 2009

细粒度的并行对企业应用重要吗?

对于科学计算来说,它无疑是重要的。对于企业应用而言,目前我个人还没遇到此类需求。目前的应用服务器用单个线程来处理一个request,这对于大多数应用都是合适的,只要响应时间在容许范围之内就没有问题。这种情况下用细粒度的并行并不经济,细粒度的并行需用更多的线程间同步,在系统负载较大时反而会降低吞吐量。
而对于耗时特别长的处理,有时可以用long run的方式解决问题。即用户先提交请求后就直接返回,等计算执行完再通知用户或直接发送结果给用户。

那么如果计算量大,又不能等待呢?Google的搜索是一个很好的例子。把大计算量的任务并行,响应时间自然就短了。不过这样的工作负载也许没有应用服务器什么事。应用服务器把计算任务交给类似Cell Broadband Engine这样的特殊机器也许更合适。

如果单个线程确实需要在本地进行细粒度的并行处理,J2EE规范和WebSphere Application Server 7也提供了相应的支持,参见
1. Service Data Objects, WorkManager, and Timers
2. The Work Manager API: Parallel Processing Within a J2EE Container

最后,不要自己创建线程,那样会干扰应用服务器的运行。

Monday, March 30, 2009

为什么Java的每个对象都有wait()/notify()方法?

Java对多线程程序的支持可以说是现存语言中最为完美的,即使C++0X今年真的能出来,也无法改变这一点。我们知道,每个Java对象都可以当成一个锁来使用,synchronize关键字会帮我们搞定一切的。那么为什么每个Java对象都有wait()/notify()方法呢?

答案很简单,synchronize关键字能同步对共享资源的访问。只要正确的使用了synchronize关键字,程序就可以保证任意时刻都只有一个线程能访问共享资源。这解决了一部分问题。更进一步,我们还需要考虑到资源通常不是无限的。假如一个共享的队列中没有任何元素,那么所有尝试从队列中获取元素的线程就无法成功。那么这些线程怎么办呢?“忙等”显然不是一个好方法。这时我们就用得到wait()/notify()方法了。当线程检测到队列为空时,他们调用队列对象的wait()方法从而进入暂停执行状态,而当某个线程成功的向队列中放入元素之后,它调用notify()方法唤醒一个等待的线程。这样,整个流程就完美的建立起来了。


另外,我们需要注意wait()和notify()方法只有在获取了队列对象的锁之后才能被调用,这是必要的。如果不这么做,就有可能出现队列中有元素,而某些线程却处于等待状态的现象。