??xml version="1.0" encoding="utf-8" standalone="yes"?>在线国产精品视频,欧美精品一二三四,日韩av系列http://www.aygfsteel.com/hiswing/archive/2006/08/30/66561.htmlhiswinghiswingWed, 30 Aug 2006 01:25:00 GMThttp://www.aygfsteel.com/hiswing/archive/2006/08/30/66561.htmlhttp://www.aygfsteel.com/hiswing/comments/66561.htmlhttp://www.aygfsteel.com/hiswing/archive/2006/08/30/66561.html#Feedback0http://www.aygfsteel.com/hiswing/comments/commentRss/66561.htmlhttp://www.aygfsteel.com/hiswing/services/trackbacks/66561.html首先让我们来复习下一什么是多线E?
多线E是q样一U机Ӟ它允许在E序中ƈ发执行多个指令流Q每个指令流都称Z个线E,彼此间互相独立?/p>
U程又称量q程Q它和进E一h有独立的执行控制Q由操作pȝ负责调度Q区别在于线E没有独立的存储I间Q而是和所属进E中的其它线E共享一个存储空_q得线E间的通信q较q程单?/p>
多个U程的执行是q发的,也就是在逻辑上“同时”,而不是否是物理上的“同时”。如果系l只有一个CPUQ那么真正的“同时”是不可能的Q但是由于CPU的速度非常快,用户感觉不到其中的区别,因此我们也不用关心它Q只需要设惛_个线E是同时执行卛_?/p>
多线E和传统的单U程在程序设计上最大的区别在于Q由于各个线E的控制彼此独立,使得各个U程之间的代码是乱序执行的?/p>
l过以上介绍Q想必大安已经回忆起当时写多线E程序的痛苦。那么再让我们回忆一下,Java中是如何实现多线E的吧?/p>
作ؓ一个完全面向对象的语言QJava提供了类 java.lang.Thread 来方便多U程~程Q这个类提供了大量的Ҏ来方便我们控制自q各个U程。让我们来看一?Thread cRThread cL重要的方法是 run() Q它为Thread cȝҎ start() 所调用Q提供我们的U程所要执行的代码。ؓ了指定我们自q代码Q只需要覆盖它Q?/p>
1
public
class
MyThread
extends
Thread
{
2
private
int
index;
3
4
public
MyThread(
int
i)
{
5
this
.index
=
i;
6
}
7
8
public
void
run()
{
9
while
(
this
.index
<
6
)
{
10
System.out.println(
"
index =
"
+
this
.index);
11
12
this
.index
++
;
13
}
14
}
15
16
public
static
void
main(String[] args)
{
17
for
(
int
i
=
0
; i
<
10
; i
++
)
{
18
new
MyThread(i).start();
19
}
20
}
21
}
22
当然Q除了以上这U方法,Javaq提供了Runnable 接口。该接口只有一个方?run()Q我们声明自qcd?Runnable 接口q提供这一ҎQ将U程代码写入其中Q就完成了这一部分的Q务。但?Runnable 接口q没有Q何对U程的支持,我们q必d?Thread cȝ实例Q这一炚w过 Thread cȝ构造函数来实现?/p>
1
public
class
MyThread
implements
Runnable
{
2
private
int
index;
3
4
public
MyThread(
int
i)
{
5
this
.index
=
i;
6
}
7
8
public
void
run()
{
9
while
(
this
.index
<
6
)
{
10
System.out.println(
"
index =
"
+
this
.index);
11
12
this
.index
++
;
13
}
14
}
15
16
public
static
void
main(String[] args)
{
17
for
(
int
i
=
0
; i
<
10
; i
++
)
{
18
new
Thread(
new
MyThread(i)).start();
19
}
20
}
21
}
22
23
我们已经习惯了以上两U线E的ҎQ但是,Eclipse的swt却不相同。如果按照我们以上的ҎQ当讉Kswt的某一lgӞpȝ会抛出异常:org.eclipse.swt.SWTException: Invalid thread access 那么Q在swt中,如保使用U程呢?
1
public
class
MyThread
extends
Thread
{
2
private
Display display;
3
private
Label miniLabel;
4
5
private
static
int
index
=
0
;
6
7
public
MyThread(Display display, Label label)
{
8
this
.display
=
display;
9
this
.miniLabel
=
label;
10
}
11
12
public
void
run()
{
13
try
{
14
while
(
true
)
{
15
Thread.sleep(
1000
);
16
if
(
!
this
.display.isDisposed())
{
17
Runnable runnable
=
new
Runnable()
{
18
public
void
run()
{
19
//
your source
20
}
21
}
;
22
23
display.asyncExec(runnable);
//
关键在这一句上
24
}
25
}
26
}
catch
(Exception ex)
{}
27
}
28
}
swt的display有两U方式实现线E:asyncExec是线E异步的QsyncExec是线E同步的?br />

]]>- 止重复启动http://www.aygfsteel.com/hiswing/archive/2006/08/10/62887.htmlhiswinghiswingThu, 10 Aug 2006 15:59:00 GMThttp://www.aygfsteel.com/hiswing/archive/2006/08/10/62887.htmlhttp://www.aygfsteel.com/hiswing/comments/62887.htmlhttp://www.aygfsteel.com/hiswing/archive/2006/08/10/62887.html#Feedback1http://www.aygfsteel.com/hiswing/comments/commentRss/62887.htmlhttp://www.aygfsteel.com/hiswing/services/trackbacks/62887.html
前些日子用SWING为朋友写了一个程序,其中有不可同时启动多个pȝ实例的要求。由于没有一个好的思\Q所以走了很多弯路。现在终于解决了Q积累了一些心h与大家分享?br />
初遇该问题时Q我首先惛_的是q程。当E序启动时判断操作系l中是否存在该进E,如果存在退出启动,否则启动E序。这个方法在VB或C语言中可以通过调用WIN32 API来实现。在JAVA中,要想实现该方法或许还要借助C的力量。(对于JAVA如何捕获q程Q还h评指正。)
攑ּ了第一U方法,惛_了弱智的Ҏ--配置文g。当pȝW一ơ启动时标识设|ؓ启动中,退出时标识设|ؓ未启动。但很快发玎ͼ当非法关闭程序(比如x时未及时关闭E序Q后Q我们的E序便永q长眠了?br />
其实Q在该程序中Q最限制我们思\的便?单机?q三个字。它l我们的印象是仅供一台机器单独用,与网l无关的。因此,我们很难思\整理到服务器与客h中去。但要解册问题恰恰要用到服务器与客h的概c想像一下我们^时启动电脑的步骤Q首先按下加电,有了电,电脑才能启动。没错,只有当电脑未加电Q也是说当我们首次启动电脑时才会做q个动作Q而且q个动作在一D|间内只会做一ơ。若要重新加电,必需先断c现在回到我们的E序Q有了这个思\Q留l我们的问题是谁来充当늚角色呢?没错Q就是之前提到过的服务器。程序首ơ启动时首先q接指定端口的服务器Q发现服务器q未启动Q于是启动服务器Q启动程序。当E序复数启动Ӟ再次q接服务器,q时发现服务器已l启动了Q于是就l止启动。代码如下:
1
public class Console
{
2
/** *//**端口?/span>*/
3
private static int iPort = 50000;
4
/** *//**ȝ?/span>*/
5
JFrame frame = null;
6
/** *//**
7
* pȝ入口
8
* @param String[] args
9
* */
10
public static void main(String[] args) throws Exception
{
11
Socket socket = null; //客户端连接器
12
Thread thread = null; //启动服务器的U程
13
14
try
{
15
//q接服务?br />16
//如果服务器未启动则抛异常
17
(socket = new Socket("localhost", iPort)).close();
18
//如果服务器已l启动则退出系l?/span>
19
System.exit(0);
20
} catch (Exception e)
{}//未做处理
21
22
//如果服务器未启动则在新的U程中启动服务器
23
(thread = new Thread(new Server())).setDaemon(true);
24
//开始线E?/span>
25
thread.start();
26
27
//启动ȝ?/span>
28
frame = new JFrame("学v无");
29
frame.setVisible(true);
30
}
31
32
/** *//**
33
* 端口监听服务器端q行
34
* @author hiswing
35
*/
36
static class Server implements Runnable
{
37
public final void run()
{
38
ServerSocket serversocket = null;
39
40
//查找没有占用的端?/span>
41
while (iPort < 60000)
{
42
try
{
43
serversocket = new ServerSocket(iPort);
44
}catch(Exception ex)
{
45
iPort++;
46
}
47
break;
48
}
49
try
{
50
do
{
51
//监听客户端是否有q接
52
serversocket.accept();
53
54
//H口在Q务栏闪动
55
if(frame.getExtendedState() == 1)
{
56
frame.setExtendedState(0);
57
}
58
if(frame.getExtendedState() != 1)
{
59
frame.toFront();
60
frame.requestFocus();
61
frame.repaint();
62
}
63
} while(true);
64
} catch (Exception ex)
{
65
//不做处理
66
}
67
}
68
}
69
}
׃没有好的思\Q我们在编E中C许多弯\Q浪费了宝贵的时间。都说Y件是智慧的结Ӟ一Ҏ错?
]]> - Swt/JFace制做pȝ托盘E序http://www.aygfsteel.com/hiswing/archive/2006/08/09/62593.htmlhiswinghiswingWed, 09 Aug 2006 08:19:00 GMThttp://www.aygfsteel.com/hiswing/archive/2006/08/09/62593.htmlhttp://www.aygfsteel.com/hiswing/comments/62593.htmlhttp://www.aygfsteel.com/hiswing/archive/2006/08/09/62593.html#Feedback1http://www.aygfsteel.com/hiswing/comments/commentRss/62593.htmlhttp://www.aygfsteel.com/hiswing/services/trackbacks/62593.html
1
// 取得pȝ托盘对象
2
final Tray tray = shell.getDisplay().getSystemTray();
3
4
if (tray != null)
{
5
// 生成托盘对象
6
final TrayItem item = new TrayItem(tray, SWT.NONE);
7
// 为托盘对象添加鼠标停留时的文?/span>
8
item.setToolTipText(“六月天?;
9
// 为托盘添加事?/span>
10
item.addListener(SWT.Show, new Listener()
{
11
public void handleEvent(Event event)
{
12
System.out.println("show");
13
}
14
});
15
item.addListener(SWT.Hide, new Listener()
{
16
public void handleEvent(Event event)
{
17
System.out.println("hide");
18
}
19
});
20
item.addListener(SWT.Selection, new Listener()
{
21
public void handleEvent(Event event)
{
22
System.out.println("selection");
23
}
24
});
25
item.addListener(SWT.DefaultSelection, new Listener()
{
26
public void handleEvent(Event event)
{
27
System.out.println("default selection");
28
}
29
});
30
// 为托盘对象添加显C用的图?/span>
31
item.setImage(image);
32
// 生成菜单?/span>
33
final Menu menu = new Menu(shell, SWT.POP_UP);
34
MenuItem miShow = new MenuItem(menu, SWT.PUSH);
35
miShow.setText("S&how");
36
37
miShow.addSelectionListener(new SelectionListener()
{
38
public void widgetSelected(SelectionEvent arg0)
{
39
shell.setVisible(true);
40
shell.setMaximized(true);
41
}
42
43
public void widgetDefaultSelected(SelectionEvent arg0)
{
44
}
45
});
46
47
MenuItem miExit = new MenuItem(menu, SWT.PUSH);
48
miExit.setText("E&xit");
49
50
miExit.addSelectionListener(new SelectionListener()
{
51
public void widgetSelected(SelectionEvent arg0)
{
52
exitAction.run();
53
}
54
55
public void widgetDefaultSelected(SelectionEvent arg0)
{
56
}
57
});
58
59
// 为托盘对象添加事Ӟ当右键点d标时Q显C?/span>
60
item.addListener(SWT.MenuDetect, new Listener()
{
61
public void handleEvent(Event event)
{
62
menu.setVisible(true);
63
}
64
});
65
}
ȝQswt/jface为javaE序员提供了快速反映的界面Q由于swt/jface本n也是利用JNI来调用系l的界面Q所以在实现界面的同时也为程序员提供了一些与操作pȝ交互的方法。利用这些方法,可以很方便快捷地完成我们的功能?br />
Eclipse的Forms也非怸错,提供了华丽的界面Q写出来的程序就如同|页一P当然要有一定的审美眼光Q有兴趣的朋友不仿研I研I?
]]> - Java Excel API操作Excel的一个问?/title>http://www.aygfsteel.com/hiswing/archive/2006/08/04/61806.htmlhiswinghiswingFri, 04 Aug 2006 09:46:00 GMThttp://www.aygfsteel.com/hiswing/archive/2006/08/04/61806.htmlhttp://www.aygfsteel.com/hiswing/comments/61806.htmlhttp://www.aygfsteel.com/hiswing/archive/2006/08/04/61806.html#Feedback2http://www.aygfsteel.com/hiswing/comments/commentRss/61806.htmlhttp://www.aygfsteel.com/hiswing/services/trackbacks/61806.html
在修改Excel文gӞ׃文g的单元格有各U样?如:ҎQ背景等)Q在更新Ӟ如果直接使用以下代码则会把单元格的样式覆盖?br />//生成新的Label
jxl.write.Label labelC = new jxl.write.Label(0, 0, "This is a Label cell");
//label插入sheet?br />ws.addCell(labelC);
正确的写法应该如下:
//q里的数据类型ؓ字符型,若ؓ其它cd请将其{为正的cdQ否则出错?br />jxl.write.Label labelC = (Label) sheet.getWritableCell(0, 0);
labelC.setString("This is a Label cell");
在利用如下代码进行拷贝操作时QL法成功?br />jxl.write.Label labelC.copyTo(0, 1)Q?
原因是该操作只是生成了labelC的一个副本,q没有真正插入sheet中。正的做法如下Q?br />sheet.addCell(jxl.write.Label labelC.copyTo(0, 1));
以前用com操作ExcelQ突然用Java Excel APIq真有点不适应。最主要的区别还是在思\上。我感觉目前Java Excel API功能q不是很强大Q操作v来非常复杂,q需改进。com一行代码就可完成的功能Q在q里需要写N行。话又说回来Q有谁比Microsoft更了解他们自q东西呢? 
]]> - 一道java题,你能做对吗?http://www.aygfsteel.com/hiswing/archive/2006/08/01/61151.htmlhiswinghiswingTue, 01 Aug 2006 03:17:00 GMThttp://www.aygfsteel.com/hiswing/archive/2006/08/01/61151.htmlhttp://www.aygfsteel.com/hiswing/comments/61151.htmlhttp://www.aygfsteel.com/hiswing/archive/2006/08/01/61151.html#Feedback11http://www.aygfsteel.com/hiswing/comments/commentRss/61151.htmlhttp://www.aygfsteel.com/hiswing/services/trackbacks/61151.html

public class Test
{

public static void main(String[] args)
{
int i = 11;
i += i++;

System.out.println(i);
}
} L出答案后自己q行一遍。记得,要先l出{案再运行?img src ="http://www.aygfsteel.com/hiswing/aggbug/61151.html" width = "1" height = "1" />
]]> - java克隆详述-?/title>http://www.aygfsteel.com/hiswing/archive/2006/07/27/60440.htmlhiswinghiswingThu, 27 Jul 2006 15:32:00 GMThttp://www.aygfsteel.com/hiswing/archive/2006/07/27/60440.htmlhttp://www.aygfsteel.com/hiswing/comments/60440.htmlhttp://www.aygfsteel.com/hiswing/archive/2006/07/27/60440.html#Feedback2http://www.aygfsteel.com/hiswing/comments/commentRss/60440.htmlhttp://www.aygfsteel.com/hiswing/services/trackbacks/60440.html
1
//倒霉的羊
2
public class Sheep implements Cloneable
{
3
private String name;
4
public void setName(String arg)
{
5
name = arg;
6
}
7
public String getName()
{
8
return name;
9
}
10
public Object clone() throws CloneNotSupportedException
{
11
return super.clone();
12
}
13
}
14
//圈
15
public class Sheepfold implements Cloneable
{
16
public Sheep sheep;
17
public String name;
18
public Sheepfold()
{
19
sheep = new Sheep();
20
}
21
public Object clone() throws CloneNotSupportedException
{
22
return super.clone();
23
}
24
}
25
//克隆
26
public class Main
{
27
public static void main(String[] args) throws Exception
{
28
Sheepfold fold = new Sheepfold();
29
fold.name = "羊?/span>";
30
fold.sheep.setName("羊");
31
Sheepfold fold2 = (Sheepfold)fold.clone();
32
System.out.println(" fold2.name = " + fold2.name);
33
System.out.println(" fold2.sheep.getName() = " + fold2.sheep.getName());
34
fold2.name = "大羊?/span>";
35
fold2.sheep.setName("大羊");
36
System.out.println("=====================================");
37
System.out.println(" fold2.name = " + fold2.name);
38
System.out.println("* fold2.sheep.getName() = " + fold2.sheep.getName());
39
System.out.println(" fold.name = " + fold.name);
40
System.out.println("* fold.sheep.getName() = " + fold.sheep.getName());
41
System.out.println("=====================================");
42
}
43
}
在这个例子中有三个类QSheep和Sheepflod都实CCloneable接口Qƈ且覆写了ObjectcȝcloneҎQ说明这两个cLh克隆能力的。注意一点,在Sheepflod中持有一个Sheep的实例,q在MaincM对其q行克隆Q结果如下:
fold2.name = 羊?br />fold2.sheep.getName() = 羊
=====================================
fold2.name = 大羊?br />* fold2.sheep.getName() = 大羊
fold.name = 羊?br />* fold.sheep.getName() = 大羊
=====================================
h意一下结果中带有"*"L两条l果语句。fold2.sheep和fold.sheep的name都变Z"大羊"Q很奇怪是吗?在此之前Q我们只对fold2.sheep的name赋过倹{ؓ什么fold.sheep的name也变Z"大羊"呢?原因很简单,因ؓ它们是指向同一个对象的不同引用。从中可以看出,调用ObjectcMclone()ҎӞ首先在内存中划分一块同原对象相同的I间Q然后将原对象的内容原样拯x对象。我们知道,java中有基本数据cdQ对于基本数据类型,q样的操作是没有问题的,但对非基本类型变量,它们保存的仅仅是对象的引用,q也是ؓ什么clone后非基本cd变量和原对象中的变量指向同一个对象的原因。可能你已经注意刎ͼE序中用CStringcdQ即对象Qؓ什么没有出现引用指向同一地址的情况?q是因ؓString是一个不可更改的c(immutable classQ,每次l它赋值时Q都会生一个新的String对象。如String str = "a"; str += "b";在这两句代码中,当执行str += "b"Ӟ实际上是重新成生了一个gؓ"ab"的String对象Q即重新分配了一块内存空间。以上cloneҎ通常被称?影子clone"?影子clone"l我们留下了一个问题,卛_个引用指向同一个对象。如何解册问题呢?{案?深度clone"。把上面的例子改成深度clone很简单,只需Sheepfold的clone()Ҏ改ؓ如下卛_Q?br />1
public Object clone() throws CloneNotSupportedException
{
2
Sheepfold fold = (Sheepfold)super.clone();
3
sheep = (Sheep)fold.sheep.clone();
4
return fold;
5
}
xQclone基本完成了。当Ӟ在实际用过E中需要注意一些问题,比如StringBuffer不可以直接cloneQ当Ӟ也有解决办法Q等{?br />
完!
2004-09-01
]]> - java克隆详述-?/title>http://www.aygfsteel.com/hiswing/archive/2006/07/27/60438.htmlhiswinghiswingThu, 27 Jul 2006 15:24:00 GMThttp://www.aygfsteel.com/hiswing/archive/2006/07/27/60438.htmlhttp://www.aygfsteel.com/hiswing/comments/60438.htmlhttp://www.aygfsteel.com/hiswing/archive/2006/07/27/60438.html#Feedback5http://www.aygfsteel.com/hiswing/comments/commentRss/60438.htmlhttp://www.aygfsteel.com/hiswing/services/trackbacks/60438.html
l常听到有h说java中没有指针。事实如此吗QnoQjava是有指针的,只不q换了个名字而已Q也是我们l常提到的引用。我们知道,在java中一切都是对象,那么我们如何操控对象Q如何在成千上万的对象中扑ֈ我们所需的那个对象呢Q又是如何让对象按照我们的意思来完成d的呢Q?br /> Object o = new Object();
q是java中最常见的语句了Q在q句话中做了三g事。首先声明一个Objectcd的变量oQ在内存中ؓ对象划分一块地址new Object()Q将声明的变量指向内存中的对象。如此一来,我们可以通过o来操U对象了。就好像孩子们玩的遥控飞机,在空中飞行的是飞机,而它做Z动作的却是孩子们手中的摇控器?br />
"克隆"是如今听到的较多的词汇,听说已经某只羊克隆了好几䆾了。但愿这U技术不要在n上实验。java中也?克隆"Q与现实世界的克隆一P一个实际存在的对象拯几䆾。如下:
q行E序l果为:
sheep.getName() = 我是真的
sheepClone.getName() = 我是真的
两只是一模一LQ哪怕那只羊瘸腿Q。让我们来看看代码。首先要注意的是SheepcdCCloneable接口Q该接口属于java.lang包,默认已经导入了)Q该接口中ƈ没有定义要实现的ҎQ是个空接口Qv标志作用。也是_实现了这个接口的就不再是只普通的,它是一只可以被克隆的羊。再往下看Q有个cloneҎQ返回Objectcd的对象,q抛出CloneNotSupportedException异常。该Ҏ覆写了父c?Object)的cloneҎQƈ在最后调用了super.clone()Q这也意味着无论clonecȝ承结构是什么样的,super.clone()都会直接或间接调用Objectcȝclone()Ҏ。看看jdk帮助文档会发玎ͼObjectcȝclone()是一个nativeҎQ我们知道,nativeҎ的效率一般来说都是远高于java中的非nativeҎ。这也说明了new一个对象,然后原对象中的数据导入到新创徏的对象中ȝ做法是多么愚蠢。必说明的是Object中的cloneҎ是protected的,所以要使用clone必ȝ承Objectc(默认Q。ƈ且ؓ了可以其它c调用该ҎQ必d其作用域讄为public?br />
以上只是一个简单clone的实现。明天说?影子clone"?深度clone"?br />
夜,׃?
2004-08-31
]]>
վ֩ģ壺
ˮ|
ӻ|
|
|
¡|
|
|
|
|
ѳ|
ƽң|
|
߮|
|
ˮ|
|
ӱ|
û|
ɳƺ|
̨|
|
ʲ|
ͩ|
|
ˮ|
̩|
|
|
ɳ|
|
Ǹ|
|
ϲ|
|
|
˿|
|
|
ˮ|
Ž|
̨|