仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 510|回复: 12
打印 上一主题 下一主题

[学习教程] JAVA网页设计Java 多线程编程(临盆者和消耗者成绩和逝世锁)仓酷云

[复制链接]
金色的骷髅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:20:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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网页编程就不一样了,保持微软的一向风格,源代码不公开
飘灵儿 该用户已被删除
沙发
发表于 2015-1-20 20:46:24 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
金色的骷髅 该用户已被删除
板凳
 楼主| 发表于 2015-1-29 22:53:12 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
再现理想 该用户已被删除
地板
发表于 2015-1-31 20:15:09 | 只看该作者
是一种使用者不需花费很多时间学习的语言
灵魂腐蚀 该用户已被删除
5#
发表于 2015-2-6 22:05:03 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
再见西城 该用户已被删除
6#
发表于 2015-2-10 01:22:47 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
深爱那片海 该用户已被删除
7#
发表于 2015-2-13 07:51:06 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
柔情似水 该用户已被删除
8#
发表于 2015-2-17 20:38:13 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
冷月葬花魂 该用户已被删除
9#
发表于 2015-2-18 15:51:25 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
小女巫 该用户已被删除
10#
发表于 2015-3-6 08:34:15 | 只看该作者
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
莫相离 该用户已被删除
11#
发表于 2015-3-11 18:24:24 | 只看该作者
是一种为 Internet发展的计算机语言
因胸联盟 该用户已被删除
12#
发表于 2015-3-19 06:46:14 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
谁可相欹 该用户已被删除
13#
发表于 2015-3-27 10:54:51 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 15:40

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表