??xml version="1.0" encoding="utf-8" standalone="yes"?>一区二区中文,国产一区在线播放,日韩亚洲欧美中文在线http://www.aygfsteel.com/cenphoenix/category/7994.htmlzh-cnWed, 28 Feb 2007 04:11:41 GMTWed, 28 Feb 2007 04:11:41 GMT60dProperties文g六种Ҏ(gu)http://www.aygfsteel.com/cenphoenix/articles/56592.htmlcenphoenixcenphoenixTue, 04 Jul 2006 13:32:00 GMThttp://www.aygfsteel.com/cenphoenix/articles/56592.htmlhttp://www.aygfsteel.com/cenphoenix/comments/56592.htmlhttp://www.aygfsteel.com/cenphoenix/articles/56592.html#Feedback0http://www.aygfsteel.com/cenphoenix/comments/commentRss/56592.htmlhttp://www.aygfsteel.com/cenphoenix/services/trackbacks/56592.html
  2。用java.util.ResourceBundlecȝgetBundle()Ҏ(gu)CZQResourceBundlerb=ResourceBundle.getBundle(name,Locale.getDefault());

  3。用java.util.PropertyResourceBundlecȝ构造函数示例:InputStreamin=newBufferedInputStream(newFileInputStream(name));ResourceBundlerb=newPropertyResourceBundle(in);

  4。用class变量的getResourceAsStream()Ҏ(gu)CZQInputStreamin=JProperties.class.getResourceAsStream(name);Propertiesp=newProperties();p.load(in);

  5。用class.getClassLoader()所得到的java.lang.ClassLoader的getResourceAsStream()Ҏ(gu)CZQInputStreamin=JProperties.class.getClassLoader().getResourceAsStream(name);Propertiesp=newProperties();p.load(in);

  6。用java.lang.ClassLoadercȝgetSystemResourceAsStream()静态方法示例:InputStreamin=ClassLoader.getSystemResourceAsStream(name);Propertiesp=newProperties();p.load(in);

  补充

  Servlet中可以用javax.servlet.ServletContext的getResourceAsStream()Ҏ(gu)CZQInputStreamin=context.getResourceAsStream(path);Propertiesp=newProperties();p.load(in);  

cenphoenix 2006-07-04 21:32 发表评论
]]>
java Threadhttp://www.aygfsteel.com/cenphoenix/articles/38898.htmlcenphoenixcenphoenixMon, 03 Apr 2006 04:29:00 GMThttp://www.aygfsteel.com/cenphoenix/articles/38898.htmlhttp://www.aygfsteel.com/cenphoenix/comments/38898.htmlhttp://www.aygfsteel.com/cenphoenix/articles/38898.html#Feedback0http://www.aygfsteel.com/cenphoenix/comments/commentRss/38898.htmlhttp://www.aygfsteel.com/cenphoenix/services/trackbacks/38898.html                   http://blog.matrix.org.cn/page/Kaizen?entry=java_thread
在论坛上面常常看到初学者对U程的无可奈何,所以ȝZ下面一文章,希望对一些正在学习用javaU程的初学者有所帮助?/font>


首先要理解线E首先需要了解一些基本的东西Q我们现在所使用的大多数操作pȝ都属于多dQ分时操作系l。正是由于这U操作系l的出现才有了多U程q个概念。我们用的windows,linux属于此列。什么是分时操作pȝ呢,通俗一点与是可以同一旉执行多个E序的操作系l,在自q?sh)脑上面Q你是不是一边听歌,一边聊天还一边看|页呢?但实际上Qƈ不上cpu在同时执行这些程序,cpu只是时间切割ؓ旉片,然后时间片分配l这些程序,获得旉片的E序开始执行,不等执行完毕Q下个程序又获得旉片开始执行,q样多个E序轮流执行一D|_׃现在cpu的高速计能力,lh的感觉就像是多个E序在同时执行一栗?br />一般可以在同一旉内执行多个程序的操作pȝ都有q程的概?一个进E就是一个执行中的程?而每一个进E都有自q立的一块内存空?一l系l资?在进E概念中,每一个进E的内部数据和状态都是完全独立的.因此可以惛_创徏q执行一个进E的pȝ开像是比较大的Q所以线E出C。在java中,E序通过控制来执行E序?E序中单个顺序的控制称为线E?多线E则指的是在单个E序中可以同时运行多个不同的U程,执行不同的Q?多线E意味着一个程序的多行语句可以看上d乎在同一旉内同时运?Q你可以前面一句话的程序换成进E,q程是程序的一ơ执行过E?是系l运行程序的基本单位Q?br />U程与进E相?是一D完成某个特定功能的代码,是程序中单个序的流控制;但与q程不同的是,同类的多个线E是׃n一块内存空间和一l系l资?而线E本w的数据通常只有微处理器的寄存器数据,以及一个供E序执行时用的堆栈.所以系l在产生一个线E?或者在各个U程之间切换?负担要比q程的?正因如此,U程也被UCؓ轻负药E?light-weight process).一个进E中可以包含多个U程.
多Q务是指在一个系l中可以同时q行多个E序,x多个独立q行的Q?每个d对应一个进E,同进E一?一个线E也有从创徏,q行到消亡的q程,UCؓU程的生命周?用线E的状?state)表明U程处在生命周期的哪个阶D?U程有创?可运?q行?d,M五中状?通过U程的控制与调度可ɾU程在这几种状态间转化每个E序臛_自动拥有一个线E?UCؓȝE?当程序加载到内存?启动ȝE?
[U程的运行机制以及调度模型]
java中多U程是一个类或一个程序执行或理多个U程执行d的能力,每个U程可以独立于其他线E而独立运行,当然也可以和其他U程协同q行Q一个类控制着它的所有线E,可以军_哪个U程得到优先U,哪个U程可以讉K其他cȝ资源Q哪个线E开始执行,哪个保持休眠状态?br />下面是线E的机制图:

U程的状态表C线E正在进行的zd以及在此旉D内所能完成的d.U程有创?可运?q行?d,M五中状?一个具有生命的U程,L处于q五U状态之一Q?br />1.创徏状?br />使用newq算W创Z个线E后,该线E仅仅是一个空对象,pȝ没有分配资源,U该U程处于创徏状?new thread)
2.可运行状?br />使用start()Ҏ(gu)启动一个线E后,pȝU程分配了除CPU外的所需资源,使该U程处于可运行状?Runnable)
3.q行中状?br />Javaq行pȝ通过调度选中一个Runnable的线E?使其占有CPUq{行中状?Running).此时,pȝ真正执行U程的run()Ҏ(gu).
4.d状?br />一个正在运行的U程因某U原因不能l运行时,q入d状?Blocked)
5.M状?br />U程l束后是M状?Dead)
同一时刻如果有多个线E处于可q行状?则他们需要排队等待CPU资源.此时每个U程自动获得一个线E的优先U?priority),优先U的高低反映U程的重要或紧急程?可运行状态的U程按优先排队,U程调度依据优先U基上的"先到先服?原则.
U程调度理器负责线E排队和CPU在线E间的分?q由U程调度法q行调度.当线E调度管理器选种某个U程?该线E获得CPU资源而进入运行状?
U程调度是先占式调度,卛_果在当前U程执行q程中一个更高优先的线E进入可q行状?则这个线E立卌调度执行.先占式调度分?独占式和分时方式.
独占方式?当前执行U程一直执行下??到执行完毕或׃某种原因d攑ּCPU,或CPU被一个更高优先的线E抢?br />分时方式?当前q行U程获得一个时间片,旉到时,即没有执行完也要让出CPU,q入可运行状?{待下一个时间片的调?pȝ选中其他可运行状态的U程执行
分时方式的系l每个U程工作若干?实现多线E同时运?br />另外h意下面的U程调度规则Q如果有不理解,不急,往下看Q:
①如果两个或是两个以上的U程都修改一个对象,那么把执行修改的Ҏ(gu)定义同步的(SynchronizedQ?如果对象更新影响到只L法,那么只度Ҏ(gu)也应该定义ؓ同步?br />②如果一个线E必ȝ待一个对象状态发生变化,那么它应该在对象内部{待Q而不是在外部{待Q它可以调用一个被同步的方法,q让q个Ҏ(gu)调用wait()
③每当一个方法改变某个对象的状态的时候,它应该调用notifyAll()Ҏ(gu)Q这l等待队列的U程提供Z来看一看执行环境是否已发生改变
④记住wait(),notify(),notifyAll()Ҏ(gu)属于Objectc,而不是Threadc,仔细查看是否每次执行wait()Ҏ(gu)都有相应的notify()或notifyAll()Ҏ(gu)Q且它们作用与相同的对象 在java中每个类都有一个主U程Q要执行一个程序,那么q个cd中一定要有mainҎ(gu)Q这个manҎ(gu)也就是java class中的ȝE。你可以自己创徏U程Q有两种Ҏ(gu)Q一是承Threadc,或是实现Runnable接口。一般情况下Q最好避免承,因ؓjava中是单根l承Q如果你选用l承Q那么你的类失MҎ(gu),当然也不能全然否定承Thread,该方法编写简?可以直接操作U程,适用于单重承情c至于选用那一U,具体情况具体分析?/font>


eg.l承Thread
public class MyThread_1 extends Thread
{
public void run()
{
//some code
}
}



eg.实现Runnable接口
public class MyThread_2 implements Runnable
{
public void run()
{
//some code
}
}


当用承创建线E,q样启动U程Q?br />new MyThread_1().start()
当用实现接口创建线E,q样启动U程Q?br />new Thread(new MyThread_2()).start()
注意Q其实是创徏一个线E实例,q以实现了Runnable接口的类为参C入这个实例,当执行这个线E的时候,MyThread_2中run里面的代码将被执行?br />下面是完成的例子Q?/font>


public class MyThread implements Runnable
{


public void run()
{
System.out.println("My Name is "+Thread.currentThread().getName());
}
public static void main(String[] args)
{
new Thread(new MyThread()).start();
}
}


执行后将打印出:
My Name is Thread-0
你也可以创徏多个U程Q像下面q样


new Thread(new MyThread()).start();
new Thread(new MyThread()).start();
new Thread(new MyThread()).start();


那么会打印出Q?/font>


My Name is Thread-0
My Name is Thread-1
My Name is Thread-2


看了上面的结果,你可能会认ؓU程的执行顺序是依次执行的,但是那只是一般情况,千万不要用以为是U程的执行机Ӟ影响U程执行序的因素有几点Q首先看看前面提到的优先U别


public class MyThread implements Runnable
{


public void run()
{
System.out.println("My Name is "+Thread.currentThread().getName());
}
public static void main(String[] args)
{
Thread t1=new Thread(new MyThread());
Thread t2=new Thread(new MyThread());
Thread t3=new Thread(new MyThread());
t2.setPriority(Thread.MAX_PRIORITY);//赋予最高优先
t1.start();
t2.start();
t3.start();
}
}


再看看结果:


My Name is Thread-1
My Name is Thread-0
My Name is Thread-2


U程的优先分ؓ10U,分别??0的整C表,默认情况?。上面的t2.setPriority(Thread.MAX_PRIORITY){h(hun)与t2.setPriority(10Q?br />然后是线E程序本w的设计Q比如用sleep,yield,joinQwait{方法(详情LJDKDocument)


public class MyThread implements Runnable
{


public void run()
{
try
{
int sleepTime=(int)(Math.random()*100);//产生随机数字Q?br />Thread.currentThread().sleep(sleepTime);//让其休眠一定时_旉又上面sleepTime军_
//public static void sleep(long millis)throw InterruptedException QAPIQ?br />System.out.println(Thread.currentThread().getName()+" 睡了 "+sleepTime);
}catch(InterruptedException ie)//׃U程在休眠可能被中断Q所以调用sleepҎ(gu)的时候需要捕捉异?br />{
ie.printStackTrace();
}
}
public static void main(String[] args)
{
Thread t1=new Thread(new MyThread());
Thread t2=new Thread(new MyThread());
Thread t3=new Thread(new MyThread());
t1.start();
t2.start();
t3.start();
}
}


执行后观察其输出Q?/font>


Thread-0 睡了 11
Thread-2 睡了 48
Thread-1 睡了 69


上面的执行结果是随机的,再执行很可能出现不同的结果。由于上面我在run中添加了休眠语句Q当U程休眠的时候就会让出cpuQcpu会选择执行处于runnable状态中的其他线E,当然也可能出现这U情况,休眠的Thread立即q入了runnable状态,cpu再次执行它?br />[U程l概念]
U程是可以被l织的,java中存在线E组的概念,每个U程都是一个线E组的成?U程l把多个U程集成Z个对?通过U程l可以同时对其中的多个线E进行操?如启动一个线E组的所有线E等.Java的线E组由java.lang包中的Thread——Groupcd?
ThreadGroupcȝ来管理一l线E?包括:U程的数?U程间的关系,U程正在执行的操?以及U程要启动或终止时间等.U程l还可以包含U程l?在Java的应用程序中,最高层的线E组是名位main的线E组,在main中还可以加入U程或线E组,在mian的子U程l中也可以加入线E和U程l?形成U程l和U程之间的树状承关pR像上面创徏的线E都是属于mainq个U程l的?br />借用上面的例子,main里面可以q样写:


public static void main(String[] args)
{
/***************************************
ThreadGroup(String name)
ThreadGroup(ThreadGroup parent, String name)
***********************************/
ThreadGroup group1=new ThreadGroup("group1");
ThreadGroup group2=new ThreadGroup(group1,"group2");
Thread t1=new Thread(group2,new MyThread());
Thread t2=new Thread(group2,new MyThread());
Thread t3=new Thread(group2,new MyThread());
t1.start();
t2.start();
t3.start();
}


U程l的嵌套Qt1,t2,t3被加入group2,group2加入group1?br />另外一个比较多是关于U程同步斚w的,试想q样一U情况,你有一W存Ƒ֜银行Q你在一安行ؓ你的账户存款Q而你的妻子在另一安行从q个账户提款Q现在你?000块在你的账户里面。你存入?000Q但是由于另一方也在对q笔存款q行操作Qh家开始执行的时候只看到账户里面原来?000元,当你的妻子提?000元后Q你d所在的银行pZ的̎户里面没有钱了,而你所在的银行却认Zq有2000元?br />看看下面的例子:


class BlankSaving //储蓄账户
{
private static int money=10000;
public void add(int i)
{
money=money+i;
System.out.println("Husband 向银行存入了 [K?+i+"]");
}
public void get(int i)
{
money=money-i;
System.out.println("Wife 向银行取C [K?+i+"]");
if(money<0)
System.out.println("余额不Q?);
}
public int showMoney()
{
return money;
}
}



class Operater implements Runnable
{
String name;
BlankSaving bs;
public Operater(BlankSaving b,String s)
{
name=s;
bs=b;


}
public static void oper(String name,BlankSaving bs)
{


if(name.equals("husband"))
{
try
{
for(int i=0;i<10;i++)
{
Thread.currentThread().sleep((int)(Math.random()*300));
bs.add(1000);
}
}catch(InterruptedException e){}
}else
{
try
{


for(int i=0;i<10;i++)
{
Thread.currentThread().sleep((int)(Math.random()*300));
bs.get(1000);
}
}catch(InterruptedException e){}
}
}
public void run()
{
oper(name,bs);
}
}
public class BankTest
{
public static void main(String[] args)throws InterruptedException
{
BlankSaving bs=new BlankSaving();
Operater o1=new Operater(bs,"husband");
Operater o2=new Operater(bs,"wife");
Thread t1=new Thread(o1);
Thread t2=new Thread(o2);
t1.start();
t2.start();
Thread.currentThread().sleep(500);
}


}


 


下面是其中一ơ的执行l果Q?/font>


---------first--------------
Husband 向银行存入了 [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Husband 向银行存入了 [K?000]
Wife 向银行取C [K?000]
Husband 向银行存入了 [K?000]
Wife 向银行取C [K?000]
Husband 向银行存入了 [K?000]
Wife 向银行取C [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Wife 向银行取C [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Husband 向银行存入了 [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Husband 向银行存入了 [K?000]


 


看到了吗Q这可不是正的需求,在husbandq没有结束操作的时候,wife插了进来,q样很可能导致意外的l果。解军_法很单,是对数据q行操作Ҏ(gu)声明为synchronized,当方法被该关键字声明后,也就意味着Q如果这个数据被加锁Q只有一个对象得到这个数据的锁的时候该对象才能对这个数据进行操作。也是当你存款的时候,q笔账户在其他地Ҏ(gu)不能q行操作的,只有你存Ƒ֮毕,银行理人员̎戯锁,其他人才能对q个账户q行操作?br />修改public static void oper(String name,BlankSaving bs)为public static void oper(String name,BlankSaving bs)Q再看看l果:


Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]


当丈夫完成操作后Q妻子才开始执行操作,q样的话Q对׃n对象的操作就不会有问题了?br />[wait and notify]
你可以利用这两个Ҏ(gu)很好的控制线E的执行程Q当U程调用waitҎ(gu)后,U程被挂vQ直到被另一U程唤醒QnotifyQ或则是如果waitҎ(gu)指定有时间得话,在没有被唤醒的情况下Q指定时间时间过后也自动被唤醒。但是要注意一定,被唤醒ƈ不是指马上执行,而是从组塞状态变为可q行状态,其是否运行还要看cpu的调度?br />事例代码Q?/font>


class MyThread_1 extends Thread
{
Object lock;
public MyThread_1(Object o)
{
lock=o;
}
public void run()
{
try
{
synchronized(lock)
{
System.out.println("Enter Thread_1 and wait");
lock.wait();
System.out.println("be notified");
}
}catch(InterruptedException e){}
}
}
class MyThread_2 extends Thread
{
Object lock;
public MyThread_2(Object o)
{
lock=o;
}
public void run()
{
synchronized(lock)
{
System.out.println("Enter Thread_2 and notify");
lock.notify();
}
}
}
public class MyThread
{
public static void main(String[] args)
{
int[] in=new int[0];//notice
MyThread_1 t1=new MyThread_1(in);
MyThread_2 t2=new MyThread_2(in);
t1.start();
t2.start();
}
}


执行l果如下Q?/font>


Enter Thread_1 and wait
Enter Thread_2 and notify
Thread_1 be notified


可能你注意到了在使用wait and notifyҎ(gu)得时候我使用了synchronized块来包装q两个方法,q是׃调用q两个方法的时候线E必获得锁Q也是上面代码中的lock[]Q如果你不用synchronized包装q两个方法的得话Q又或则锁不一是同一把,比如在MyThread_2中synchronized(lock)改ؓsynchronized(this),那么执行q个E序的时候将会抛出java.lang.IllegalMonitorStateException执行期异常。另外wait and notifyҎ(gu)是Object中的Qƈ不在Threadq个cM。最后你可能注意Cq点Qint[] in=new int[0];Z么不是创建new Object而是一?长度的数l,那是因ؓ在java中创Z?长度的数l来充当锁更加高效?br />Thread作ؓjava中一重要l成部分Q当然还有很多地斚w要更深刻的认识,上面只是对Thread的一些常识和易错问题做了一个简要的ȝQ若要真正的掌握java的线E,q需要自己多做ȝ



cenphoenix 2006-04-03 12:29 发表评论
]]>
վ֩ģ壺 ޭ| ɽ| ɽ| | | | ͺ| | Ƽ| | | | ν| ľ| | ɽ| żҸ| | «| ̶| ͼ| | ˮ| | ɽ| ˳| Դ| ɽ| | ̨| | | ӡ| | | ʯ| ƽ| | ɽ| | |