仓酷云

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

[学习教程] JAVA网页设计Java多线程程序计划进门

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

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

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

x
前些天,在CSDN上看到了一个消息,说是ASP.NETAJAX成功在Linux上运行,这一点对我触动很大,而且引发了我许多感叹,所以想写出来分享一下。程序|多线程|计划在Java言语发生前,传统的程序计划言语的程序统一时候只能单义务操纵,效力十分低,比方程序常常在吸收数据输出时产生堵塞,只要比及程序取得数据后才干持续运转。跟着Internet的迅猛开展,这类情况愈来愈不克不及让人们忍耐:假如收集吸收数据堵塞,背景程序就处于守候形态而不持续任何操纵,而这类堵塞是常常会碰着的,此时CPU资本被白白的闲置起来。假如在背景程序中可以同时处置多个义务,该多好啊!应Internet手艺而生的Java言语办理了这个成绩,多线程程序是Java言语的一个很主要的特性。在一个Java程序中,我们能够同时并交运行多个绝对自力的线程,比方,我们假如创立一个线程来举行数据输出输入,而创立另外一个线程在背景举行别的的数据处置,假如输出输入线程在吸收数据时堵塞,而处置数据的线程仍旧在运转。多线程程序计划年夜年夜进步了程序实行效力和处置才能。


  线程的创立


  我们晓得Java是面向对象的程序言语,用Java举行程序计划就是计划和利用类,Java为我们供应了线程类Thread来创立线程,创立线程与创立一般的类的对象的操纵是一样的,而线程就是Thread类或其子类的实例对象。上面是一个创立启动一个线程的语句:


  Threadthread1=newThread();file://声明一个对象实例,即创立一个线程;


  Thread1.run();file://用Thread类中的run()办法启动线程;


  从这个例子,我们能够经由过程Thread()机关办法创立一个线程,并启动该线程。现实上,启动线程,也就是启动线程的run()办法,而Thread类中的run()办法没有任何操纵语句,以是这个线程没有任何操纵。要使线程完成预定功效,必需界说本人的run()办法。Java中一般有两种体例界说run()办法:


  经由过程界说一个Thread类的子类,在该子类中重写run()办法。Thread子类的实例对象就是一个线程,明显,该线程有我们本人计划的线程体run()办法,启动线程就启动了子类中重写的run()办法。


  经由过程Runnable接口,在该接口中界说run()办法的接口。所谓接口跟类十分相似,次要用来完成特别功效,如庞大干系的多重承继功效。在此,我们界说一个完成Runnable()接口的类,在该类中界说本人的run()办法,然后以该类的实例对象为参数挪用Thread类的机关办法来创立一个线程。


  线程被实践创立后处于待命形态,激活(启动)线程就是启动线程的run()办法,这是经由过程挪用线程的start()办法来完成的。


  上面一个例籽实践了怎样经由过程上述两种办法创立线程并启动它们:


  //经由过程Thread类的子类创立的线程;


   classthread1extendsThread


    {file://自界说线程的run()办法;


     publicvoidrun()


      {


       System.out.println("Thread1isrunning…");


      }


     }


   file://经由过程Runnable接口创立的别的一个线程;


  classthread2implementsRunnable


   {file://自界说线程的run()办法;


    publicvoidrun()


    {


     System.out.println("Thread2isrunning…");


    }


   }


   file://程序的主类


   classMulti_Threadfile://声明主类;


    {


     plubicstaticvoidmail(Stringargs[])file://声明主办法;


      {


       thread1threadone=newthread1();file://用Thread类的子类创立线程;


       Threadthreadtwo=newThread(newthread2());file://用Runnable接口类的对象创立线程;


       threadone.start();threadtwo.start();file://strat()办法启动线程;


      }


     }


  运转该程序就能够看出,线程threadone和threadtwo瓜代占用CPU,处于并交运行形态。能够看出,启动线程的run()办法是经由过程挪用线程的start()办法来完成的(见上例中主类),挪用start()办法启动线程的run()办法分歧于一样平常的挪用办法,挪用一样平常办法时,必需比及一样平常办法实行终了才干够前往start()办法,而启动线程的run()办法后,start()告知体系该线程筹办停当能够启动run()办法后,就前往start()办法实行挪用start()办法语句上面的语句,这时候run()办法大概还在运转,如许,线程的启动和运转并行举行,完成了多义务操纵。


  线程的优先级


  关于多线程程序,每一个线程的主要水平是不尽不异,如多个线程在守候取得CPU工夫时,常常我们必要优先级高的线程优先抢占到CPU工夫得以实行;又如多个线程瓜代实行时,优先级决意了级别高的线程失掉CPU的次数多一些且工夫多长一些;如许,高优先级的线程处置的义务效力就高一些。


  Java中线程的优先级从低到高以整数1~10暗示,共分为10级,设置优先级是经由过程挪用线程对象的setPriority()办法,如上例中,设置优先级的语句为:


  thread1threadone=newthread1();file://用Thread类的子类创立线程;


  Threadthreadtwo=newThread(newthread2());file://用Runnable接口类的对象创立线程;


  threadone.setPriority(6);file://设置threadone的优先级6;


  threadtwo.setPriority(3);file://设置threadtwo的优先级3;


  threadone.start();threadtwo.start();file://strat()办法启动线程;


  如许,线程threadone将会优先于线程threadtwo实行,并将占据更多的CPU工夫。该例中,优先级设置放在线程启动前,也能够在启动落后行设置,以满意分歧的优先级需求。


  线程的(同步)把持


  一个Java程序的多线程之间能够共享数据。当线程以异步体例会见共享数据时,偶然候是不平安的大概反面逻辑的。好比,统一时候一个线程在读取数据,别的一个线程在处置数据,当处置数据的线程没有比及读取数据的线程读取终了就去向理数据,一定失掉毛病的处置了局。这和我们后面提到的读取数据和处置数据并行多义务其实不冲突,这儿指的是处置数据的线程不克不及处置以后还没有读取停止的数据,可是能够处置别的的数据。


  假如我们接纳多线程同步把持机制,比及第一个线程读取完数据,第二个线程才干处置该数据,就会制止毛病。可见,线程同步是多线程编程的一个相称主要的手艺。


  在讲线程的同步把持前我们必要交卸以下观点:


  1用Java关头字synchonized同步对共享数据操纵的办法


  在一个对象中,用synchonized声明的办法为同步办法。Java中有一个同步模子-监督器,卖力办理线程对对象中的同步办法的会见,它的道理是:付与该对象独一一把钥匙,当多个线程进进对象,只要获得该对象钥匙的线程才能够会见同步办法,别的线程在该对象中守候,直到该线程用wait()办法保持这把钥匙,别的守候的线程抢占该钥匙,抢占到钥匙的线程后才可得以实行,而没有获得钥匙的线程仍被堵塞在该对象中守候。


  file://声明同步的一种体例:将办法声明同步


  classstore


   {


    publicsynchonizedvoidstore_in()


    {


      ….


    }


    publicsynchonizedvoidstore_out(){


     ….}


    }


  2使用wait()、notify()及notifyAll()办法发送动静完成线程间的互相接洽


  Java程序中多个线程经由过程动静来完成互动接洽的,这几种办法完成了线程间的动静发送。比方界说一个对象的synchonized办法,统一时候只可以有一个线程会见该对象中的同步办法,别的线程被堵塞。一般能够用notify()或notifyAll()办法叫醒别的一个或一切线程。而利用wait()办法来使该线程处于堵塞形态,守候别的的线程用notify()叫醒。


  一个实践的例子就是临盆和发卖,临盆单位将产物临盆出来放在堆栈中,发卖单位则从堆栈中提走产物,在这个过程当中,发卖单位必需在堆栈中有产物时才干提货;假如堆栈中没有产物,则发卖单位必需守候。


  程序中,假设我们界说一个堆栈类store,该类的实例对象就相称于堆栈,在store类中界说两个成员办法:store_in(),用来摹拟产物打造者往堆栈中增加产物;strore_out()办法则用来摹拟发卖者从堆栈中取走产物。然后界说两个线程类:customer类,个中的run()办法经由过程挪用堆栈类中的store_out()从堆栈中取走产物,摹拟发卖者;别的一个线程类producer中的run()办法经由过程挪用堆栈类中的store_in()办法向堆栈增加产物,摹拟产物打造者。在主类中创立并启动线程,完成向堆栈中增加产物或取走产物。


  假如堆栈类中的store_in()和store_out()办法不声明同步,这就是个一样平常的多线程,我们晓得,一个程序中的多线程是瓜代实行的,运转也是无序的,如许,便可能存在如许的成绩:


  堆栈中没有产物了,发卖者还在不休光临,并且还一直的在取产物,这在实际中是不成思义的,在程序中就体现为负值;假如将堆栈类中的stroe_in()和store_out()办法声明同步,如上例所示:就把持了统一时候只能有一个线程会见堆栈对象中的同步办法;即一个临盆类线程会见被声明为同步的store_in()办法时,别的线程将不克不及够会见对象中的store_out()同步办法,固然也不克不及会见store_in()办法。必需比及该线程挪用wait()办法保持钥匙,别的线程才无机会会见同步办法。


  这个道理实践中也很好了解,当临盆者(producer)获得堆栈独一的钥匙,就向堆栈中添放产物,此时别的的发卖者(customer,能够是一个或多个)不成能获得钥匙,只要当临盆者添放产物停止,交还钥匙而且关照发卖者,分歧的发卖者依据获得钥匙的前后与反对定是不是能够进进堆栈中提走产物。


最后我再次声明,我并没有说不看好java,实际上我对java很乐观的,毕竟她正在不断改进中,我相信她总有一天会和.net并驾齐驱的
谁可相欹 该用户已被删除
沙发
发表于 2015-1-21 10:38:21 | 只看该作者
是一种使用者不需花费很多时间学习的语言
透明 该用户已被删除
板凳
发表于 2015-1-25 09:18:19 | 只看该作者
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
莫相离 该用户已被删除
地板
发表于 2015-1-27 13:10:48 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
深爱那片海 该用户已被删除
5#
发表于 2015-2-5 05:14:05 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
萌萌妈妈 该用户已被删除
6#
 楼主| 发表于 2015-2-6 08:03:59 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
金色的骷髅 该用户已被删除
7#
发表于 2015-2-15 18:32:00 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
因胸联盟 该用户已被删除
8#
发表于 2015-2-22 07:03:45 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
爱飞 该用户已被删除
9#
发表于 2015-2-26 01:41:30 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
不帅 该用户已被删除
10#
发表于 2015-3-7 23:32:05 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
小妖女 该用户已被删除
11#
发表于 2015-3-8 23:50:36 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
老尸 该用户已被删除
12#
发表于 2015-3-16 17:51:50 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
若天明 该用户已被删除
13#
发表于 2015-3-17 08:11:44 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
14#
发表于 2015-3-24 03:02:02 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
分手快乐 该用户已被删除
15#
发表于 2015-4-1 09:47:39 | 只看该作者
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
冷月葬花魂 该用户已被删除
16#
发表于 2015-4-3 20:57:21 | 只看该作者
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
小魔女 该用户已被删除
17#
发表于 2015-4-7 00:20:22 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
柔情似水 该用户已被删除
18#
发表于 2015-4-21 19:57:48 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
灵魂腐蚀 该用户已被删除
19#
发表于 2015-5-1 22:09:28 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
再见西城 该用户已被删除
20#
发表于 2015-5-3 11:09:34 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-14 03:48

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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