|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
轮性能微软曾做过一个例子,就是同一个项目用java和.net网页编程来作,结果开发周期,.net网页编程是java的一半,性能java是.net网页编程的十分之一,代码量java是.net网页编程的三倍。呵呵,这说明了什么,.net网页编程的全方位比java好。但是有的人说.net网页编程不能跨平台,这个问题我和我同学曾讨论过,都认为微软的.net网页编程很可能早都可以跨平台了,但是微软为了保护他们的操作系统,所以才没有推出跨平台的.net网页编程,只是推出了跨语言的.net网页编程,Java线程:并发合作-临盆者消耗者模子
关于多线程程序来讲,不论任何编程言语,临盆者和消耗者模子都是最典范的。就像进修每门编程言语一样,HelloWorld!都是最典范的例子。
实践上,正确说应当是“临盆者-消耗者-仓储”模子,分开了仓储,临盆者消耗者模子就显得没有压服力了。
关于此模子,应当明白一下几点:
1、临盆者仅仅在仓储未满时分临盆,仓满则中断临盆。
2、消耗者仅仅在仓储有产物时分才干消耗,仓空则守候。
3、当消耗者发明仓储没产物可消耗时分会关照临盆者临盆。
4、临盆者在临盆出可消耗产物时分,应当关照守候的消耗者往消耗。
此模子将要分离java.lang.Object的wait与notify、notifyAll办法来完成以上的需求。这长短常主要的。
/**
*Java线程:并发合作-临盆者消耗者模子
*
*@authorleizhimin2009-11-414:54:36
*/
publicclassTest{
publicstaticvoidmain(String[]args){
Godowngodown=newGodown(30);
Consumerc1=newConsumer(50,godown);
Consumerc2=newConsumer(20,godown);
Consumerc3=newConsumer(30,godown);
Producerp1=newProducer(10,godown);
Producerp2=newProducer(10,godown);
Producerp3=newProducer(10,godown);
Producerp4=newProducer(10,godown);
Producerp5=newProducer(10,godown);
Producerp6=newProducer(10,godown);
Producerp7=newProducer(80,godown);
c1.start();
c2.start();
c3.start();
p1.start();
p2.start();
p3.start();
p4.start();
p5.start();
p6.start();
p7.start();
}
}
/**
*堆栈
*/
classGodown{
publicstaticfinalintmax_size=100;//最年夜库存量
publicintcurnum;//以后库存量
Godown(){
}
Godown(intcurnum){
this.curnum=curnum;
}
/**
*临盆指定命量的产物
*
*@paramneednum
*/
publicsynchronizedvoidproduce(intneednum){
//测试是不是必要临盆
while(neednum+curnum>max_size){
System.out.println("要临盆的产物数目"+neednum+"凌驾残剩库存量"+(max_size-curnum)+",临时不克不及实行临盆义务!");
try{
//以后的临盆线程守候
wait();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
//满意临盆前提,则举行临盆,这里复杂的变动以后库存量
curnum+=neednum;
System.out.println("已临盆了"+neednum+"个产物,现仓储量为"+curnum);
//叫醒在此对象监督器上守候的一切线程
notifyAll();
}
/**
*消耗指定命量的产物
*
*@paramneednum
*/
publicsynchronizedvoidconsume(intneednum){
//测试是不是可消耗
while(curnum<neednum){
try{
//以后的临盆线程守候
wait();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
//满意消耗前提,则举行消耗,这里复杂的变动以后库存量
curnum-=neednum;
System.out.println("已消耗了"+neednum+"个产物,现仓储量为"+curnum);
//叫醒在此对象监督器上守候的一切线程
notifyAll();
}
}
/**
*临盆者
*/
classProducerextendsThread{
privateintneednum;//临盆产物的数目
privateGodowngodown;//堆栈
Producer(intneednum,Godowngodown){
this.neednum=neednum;
this.godown=godown;
}
publicvoidrun(){
//临盆指定命量的产物
godown.produce(neednum);
}
}
/**
*消耗者
*/
classConsumerextendsThread{
privateintneednum;//临盆产物的数目
privateGodowngodown;//堆栈
Consumer(intneednum,Godowngodown){
this.neednum=neednum;
this.godown=godown;
}
publicvoidrun(){
//消耗指定命量的产物
godown.consume(neednum);
}
}
已临盆了10个产物,现仓储量为40
已临盆了10个产物,现仓储量为50
已消耗了50个产物,现仓储量为0
已临盆了80个产物,现仓储量为80
已消耗了30个产物,现仓储量为50
已临盆了10个产物,现仓储量为60
已消耗了20个产物,现仓储量为40
已临盆了10个产物,现仓储量为50
已临盆了10个产物,现仓储量为60
已临盆了10个产物,现仓储量为70
Processfinishedwithexitcode0
申明:
关于本例,要申明的是当发明不克不及满意临盆大概消耗前提的时分,挪用对象的wait办法,wait办法的感化是开释以后线程的所取得的锁,并挪用对象的notifyAll()办法,关照(叫醒)该对象上其他守候线程,使得其持续实行。如许,全部临盆者、消耗者线程得以准确的合作实行。
notifyAll()办法,起到的是一个关照感化,不开释锁,也不猎取锁。只是告知该对象上守候的线程“能够合作实行了,都醒往复实行吧”。
本例仅仅是临盆者消耗者模子中最复杂的一种暗示,本例中,假如消耗者消耗的仓储量达不到满意,而又没有临盆者,则程序会一向处于守候形态,这固然是不合错误的。实践上能够将此例举行修正,修正为,依据消耗驱动临盆,同时临盆分身堆栈,假如仓不满就临盆,并对每次最年夜消耗量做个限定,如许就不存在此成绩了,固然如许的例子更庞大,更难以申明如许一个复杂模子。
但是一些大型开发或者是保密型比较高的项目都会用java,原因有2点,一:java是开源的,不怕别人留后门,偷我工具,.net网页编程就不一样了,保持微软的一向风格,源代码不公开 |
|