Tuesday, June 09, 2009

Swing中JTextField的死锁问题

Swing中的JTextField如果使用不当,会造成死锁。这与JTextField中的两个锁有关系,一个是其继承来的Container.getTreeLock()方法返回的组件锁,一个是JTextField自己的readLock() writeLock()锁。

1)getTreeLock()会在每次计算组件大小(getPreferredSize方法)的时候调用。
2)设置JTextField的文字时则会在得到了writeLock后,再去尝试得到getTreeLock,已更新组件属性(本例中就是调用invalidate()方法)。
3)而一旦write锁不释放,所有尝试得到read锁的线程都将处于wait状态。
这三个条件就可以在多线程环境下构造出一个死锁。看下面的例程:

测试代码如下:
public class TryLock
{

/**
* @param args
*/
public static void main(String[] args)
{
final JFrame frame = new JFrame();
frame.setSize(300, 300);
frame.setVisible(true);
final JTextField txt = new JTextField();
frame.getContentPane().setLayout(new FlowLayout());
frame.getContentPane().add(txt);
Thread th = new Thread(new Runnable()
{
public void run()
{
while (true)
{
try
{
Thread.currentThread().sleep(1);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
frame.pack();//1) pack时会调用JTextField的getPreferredSize方法,#必须得到read锁。
}
}
});
th.setName("循环pack");
th.start();

while (true)
{
try
{
Thread.currentThread().sleep(1);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
SwingUtilities.invokeLater(new Runnable()
{

public void run()
{
txt.setText("asdfasdfasdf");// 2)必须得到write锁,并且在更新完毕后,释放write锁之前要getTreeLock()。
}

});

}
}
}

上面的例程一旦运行几乎马上就会陷入死锁状态。Swing线程处于等待状态,GUI不再repaint。

用了很久的Swing,总算知道啥叫Swing不是线程安全的了。状态不一致还好说,锁住事情可就大喽。

Sunday, June 07, 2009

Mark

我对于不够有意思的事情提不起长久的足够的精神头

Saturday, May 09, 2009

T200B的摆放和音量调节

T200B的声音调节可以使用遥控器和音响后面的旋钮。但是印象后面的旋钮只记增减量,与位置无关,所以如果遥控器可以使用的话,这个旋钮基本没有作用。

T200B的遥控器有六个按钮,L+和L-
可以单独调节左音箱音量,R+和R-可以单独调节右音箱音量,Vol+和Vol-可以同时调节两个音箱的音量。

首先可用使用L+、L-、R+和R-来确定哪个是左音箱,哪个是右边的音箱。这样就可以正确摆放了。下面为了把RCA线连到接正确的声道,可以使用一些左右声道测试的音频。下面这个视频是专门进行左右声道测试的http://www.56.com/u30/v_MTU2ODE4ODM.html

音箱摆放对,音频线插对之后,就是最麻烦的音量调节了。音箱打开之后,不要使用音箱后面的音量调节按钮,而是要用遥控器对音量调节。
L+、L-、R+和R-四个按钮最好不要单独使用。因为它只会调节单个音箱的音量。
当使用L+和L-后,遥控器的显示器上会显示左音箱的音量。如果使用R+或R-后,遥控器上就只会显示右音箱的音量。按下Send键后,就可以将音量发送到音箱。

Vol+和Vol-是最疑惑的按钮,它会同时调节两个音箱的音量,但是不会同步两个音箱的音量。举例说,如果左边音量时30,右边音量是33,按下Vol+五下后,左边音量是35,右边是38。但是最让人迷糊的事情是,如果使用Vol+或Vol-后,遥控器的显示器上会显示Master,而不是显示左右音箱的音量。这就隐瞒了“左右音箱音量不同”这个事实。

所以最好的办法是使用遥控器上的Vol+、Vol-和Send三个键,别的都别用。使用的时候首先使用Vol+或Vol-调节好一个音箱的音量,然后使用Send键把音量发送到另一个音箱上,就算是调节好音量了。

Thursday, March 26, 2009

214特供:要嫁就嫁男程序员 !!

来自豆瓣……
  1. 专一的心,除了计算机就是你!
  2. 不喝酒不发脾气!
  3. 一套衣服穿半年!
  4. 没时间接触其它Girl,想搞婚外恋也没可能。
  5. 平时总加班,所以周末一定会怀着一颗愧疚的心在家陪老婆逛街、看电视、聊天、做家务。
  6. 只认识0和1,基本没理财能力,一定会主动把所有的钱都交给老婆管,还会千恩万谢地。
  7. 知道既然世界上不存在没有Bug的程序,就更加不会有没有缺点的人,所以绝不会老婆太过苛求。
  8. 知道系统若不经常维护就无法保持稳定运行,所以一定会每天都对老婆精心呵护。
  9. 会帮老婆把菜谱改写成if...then...do while的格式,并且带有漂亮的缩进。
  10. 老婆可以对所有的表弟、表妹宣称:“你们的毕业设计我全包了……”
  11. 老婆的QQ不好用了,急得不行。程序员会从容地说:“没事,交给我吧”,然后祭出SoftIce、WinDbg、VisualStidio 20XX调试3小时,最后搞到系统崩溃,重装了事。
  12. 如果将来小孩不爱学习,老婆就可以教育他说:“再不用功,将来就会像你老爹那样,只能作程序员……”
  13. 如果将来小孩沉迷网游,老婆就可以埋汰他说:“你还在玩你老爸在厕所里憋出来的那个破游戏呐?”
  14. 如果将来小孩嫌背单词太枯燥,老婆就可以把程序员的代码拿给他看:“看你老爹为了背单词,重复了多少遍if else for 和 string啊?!”
  15. 嫁给瘦弱的程序员,也许永远无法目睹他像李连杰那样以一敌十的英姿,却也会听到他吼道:“哪个孙子又在QQ上骂你呐?看我不盗了她的号……”
  16. 嫁给程序员,也许一辈子没机会开奔驰、坐宝马,却也会听见他在梦中叹道:“要是奔驰宝马也能盗版就好了……”
  17. 对色彩和流行毫无感觉。所以当老婆从试衣间里走出来的时候,他会故作沉思状地摸摸下巴,然后随机从数组["很可爱","显得你更高挑了","显得你更文雅了","哇,好性感!","好像不太适合你这么瘦的女孩子","好清纯!","这颜色最适合你这样皮肤好的女孩子了","天哪,穿在你身上就是不一样!"]中选择一个Item。
  18. 除了每个月买一本书,就没有其它需要花钱的地方,剩下的钱只能变着法的给老婆买各种首饰和衣服。
  19. 每天都读书到深夜,是孩子的好榜样。
  20. 每天都被Bug和客户双重折磨,有极好的耐心和涵养,就算跟老婆吵架也能保持温柔和冷静,不太可能说出不理智的话伤了老婆的心。

Saturday, March 14, 2009

Google Search

Sunday, March 08, 2009

Mana - Rayando el sol

Rayando el sol
rayando por ti
esta pena, me duele, me quema sin tu amor
no me has llamado, estoy desesperado son
muchas lunas las que te he llorado.
CORO

Rayando el sol, oeooo desesperación es más
fácil llegar al sol, que a tu corazón me muero
por ti oeooo viviendo sin ti y no aguanto, me
duele tanto estar así rayando el sol.
A tu casa yo fui y no te encontré en el
parque, en la plaza, en el cine yo te busqué, te
tengo atrapada entre mi piel y mi alma más
ya no puedo tanto y quiero estar junto a ti.
CORO
(Solo guitarra)
Rayando el sol, oeooo desesperación es más
fácil llegar al sol que a tu corazón oh me muero
por ti, viviendo sin ti y no aguanto,
me duele tanto estar así rayando el sol.
CORO
Rayando por ti
rayando
rayando uuuh, rayando, rayando el sol
rayando ay, ay, ay, ay, rayando el sol
rayando.

Saturday, February 14, 2009

The Boondock Saintes

"
We do not ask for your poor, or your hungry.
We do not want your tired and sick.
It is your corrupt we claim.
It is your evil that will be sought by us.
With every breath, we shall hunt them down.
Each day we will spill their blood,
'til it rains down from the skies.
Do not kill.
Do not rape.
Do not steal.
These are principles which every man of every faith can embrace.
These are not polite suggestions;
these are codes of behavior, and those of you that ignore them will pay the dearest cost.
There are varying degrees of evil.
We urge you lesser forms of filth not to push the bounds and cross over into true corruption, into
our domain.
For if you do, one day you will look behind you and you will see we three,
and on that day you will reap it.
And we will send you to whatever god you wish
"

"
And shepherds we shall be
For Thee, my Lord, for Thee
Power hath descended forth from Thy hand
That our feet may swiftly carry out Thy command
So we shall flow a river forth to Thee
And teeming with souls shall it ever be
In nomine Patri, et Filii, et Spiritus Sancti
"

"
The question is not how far. The question is, do you possess the constitution, the depth of faith, to go as far as is needed
"