仓酷云
标题:
JAVA网页编程之中止Java线程
[打印本页]
作者:
爱飞
时间:
2015-1-18 11:43
标题:
JAVA网页编程之中止Java线程
JAVA是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由升阳(SunMicrosystems)公司的詹姆斯·高斯林(JamesGosling)等人于1990年代初开发。因为大概招致非常举动的发生,多线程手艺明显关于开辟职员来讲提出了一系列新的应战。本文,我们迁就这些应战之一:怎样中止一个正在运转的线程睁开会商。
在Java中经由过程其内建的线程撑持,编写多线程的程序仍是相称复杂的。但是,接纳多线程手艺将对程序开辟职员提出了一些列的应战,假如没有失掉准确的处置,大概会招致非常举动的发生,和难以发明的不对。本文,我们迁就这些应战之一:怎样中止一个正在运转的线程睁开会商。
背景
中止一个线程意味着在完成其义务之前,中断线程正在举行的事情,即无效的中断以后操纵。线程中止后是守候新的义务仍是持续举行下一步操纵将取决于使用程序。
只管在最后看起来对照复杂,你仍是必要事后接纳一些措施以求取得幻想的了局。这里就你必需注重的成绩提出了一些倡议:
起首,不要利用Thread.stop办法。只管它切实其实能够中断一个正在运转的线程,但如许的办法其实不平安,并遭到了开辟职员广泛的否决。这也大概意味着在将来的Java版本中它大概不会呈现。
另外一种其实不倡议的办法是Thread.interrupt。有人大概会将其与上文提到的办法相搅浑。不管它的名字暗示甚么,这类办法现实上并没有当即中止一个正在运转的线程(厥后也不会),如列表A所示。它创立了一个线程,而且实验利用Thread.interrupt来中断此线程。对Thread.sleep()的挪用供应了丰裕的工夫来举行线程的初始化和停止。线程自己并没有做任何有效的事变。
假如运转列表A中的代码,在把持台中你能够看到相似的以下内容:
Startingthread...
Threadisrunning...
Threadisrunning...
Threadisrunning...
Interruptingthread...
Threadisrunning...
Threadisrunning...
Threadisrunning...
Stoppingapplication...
即便在挪用Thread.interrupt()以后,线程仍是运转了一段工夫。
真实的中止一个线程
中止一个线程的最好的保举办法是利用一个共享变量来唆使线程必需中断今朝所做的事情。线程必需周期性的对变量举行反省,特别在处置较长的操纵的时分,然后经由过程有序的体例中断线程义务。列表B的代码给出了此手艺的详细完成:
运转列表B中的代码将会发生以下输入(注重线程在前一种办法中是怎样加入的):
Startingthread...
Threadisrunning...
Threadisrunning...
Threadisrunning...
Askingthreadtostop...
Threadexitingunderrequest...
Stoppingapplication...
只管如许的办法必要编写必定量代码,但这其实不会给实行这些线程和依据必要对线程举行扫除带来多年夜贫苦,而特别是扫除线程关于任何一个多线程的使用程序来讲都是相对必须的。只必要确保已对共享变量声明为可变,大概将任何对其的会见封装在同步代码块或办法内里。
到如今为止,统统都很顺遂。但假如线程被封闭以守候一些事务,那末将会产生些甚么?固然,假如线程被封闭,它将不克不及对共享变量举行反省,从而没法中断。有良多时分会产生如许的情形,诸如对Object.wait()、ServerSocket.accept()和DatagramSocket.receive()瞪函数举行挪用的时分。
这些函数都可以将线程永久的封闭起来。即便接纳了超机会制,也许也不会可行,大概让人没法忍耐线程一向运转直到抵达超时形态。以是必需接纳某种机制以使线程延迟的加入封闭形态。
不幸的是,这里还没有如许的机制可以合用于一切的情形。但能够依据详细的情形来利用一些特定的技能。在以下的部分,我将给出关于尽年夜部分的罕见情形所接纳的办理计划。
经由过程Thread.interrupt()中止一个线程
如列表A所示,接纳Thread.interrupt()办法并没有中止一个正在运转的线程。此办法现实上做的只是假如线程被封闭则抛出一其中断旌旗灯号,由此线程加入了封闭形态。更加准确的讲,假如线程被封闭在办法Object.wait、Thread.join或是Thread.sleep,它将吸收一个InterruptedException,从而提早闭幕封闭办法。
因而,假如一个线程被封闭在上述办法中的恣意一个,中断它的准确办法是设置共享变量,并对其挪用interrupt()办法(注重起首设置变量十分主要)。假如线程没有被锁定,挪用interrupt()则可有可无,不然,线程将会失掉一个非常(线程自己必需筹办优点理这类情形)然前进出锁定形态。在任何一种情形中,终极线程都将会检测共享变量并停止。列表C的复杂典范程序标明了这一手艺的使用。
一旦Thread.interrupt()在列表C代码中失掉挪用,线程将取得一个非常,因而它加入了封闭形态并决意它应该中断。运转这些代码将输入一下了局:
Startingthread...
Threadrunning...
Threadrunning...
Threadrunning...
Askingthreadtostop...
Threadinterrupted...
Threadexitingunderrequest...
Stoppingapplication...
对I/O操纵举行中止
但假如线程是在实行I/O操纵时被封闭将怎样办理?I/O能够在一段可不雅的工夫里坚持对一个线程的封闭,特别触及收集通讯的时分。好比,一个服务器大概会守候用户哀求,大概一个收集使用程序会守候远程主机的呼应。
假如你正在利用通道――在Java1.4中能够取得的新的I/OAPI――封闭的线程将会失掉一个ClosedByInterruptException非常。假如是这类情形,处置的逻辑办法与在第三个例子中所利用的不异――分歧的仅仅是发生的非常有所区分。
可是,因为新的I/O比来才公布而且另有待进一步研讨,你也大概还在利用Java1.0以来一向供应的传统的I/O。这类情形下,利用Thread.interrupt()不会发生任何匡助,缘故原由是线程将不会加入封闭形态。列表D中的代码显现了这一历程。只管挪用了interrupt()办法,线程仍是没有加入封闭形态。
值得光荣的是,JavaPlatform供应了在这类情形下的办理计划:经由过程挪用锁定线程的socket的close()办法。如许的情形下,假如线程是在举行I/O操纵时被锁定,线程将失掉一个SocketException非常,这十分相似于interrupt()办法激发了InterruptedException非常的情形。
独一必要提示的中央是对socket的援用必需可用,如许的话close()办法才干被挪用。这也意味着socket对象也必需被共享。列表E显现了这类情形。处置的逻辑历程与之前给出的典范不异。
运转列表E中代码将会失掉以下预期了局:
Startingthread...
Waitingforconnection...
Askingthreadtostop...
accept()failedorinterrupted...
Threadexitingunderrequest...
Stoppingapplication...
多线程是功效十分壮大的工具,但也给本身的处置带来了一些列应战。个中之一即是怎样中止一个正在运转的线程。假如处置妥当,利用这些手艺中止线程的难度将不会年夜于利用JavaPlatform供应的内建操纵完成一样的义务。
列表A:经由过程Thread.interrupt()中止线程
classExample1extendsThread{
publicstaticvoidmain(Stringargs[])throwsException{
Example1thread=newExample1();
System.out.println("Startingthread...");
thread.start();
Thread.sleep(3000);
System.out.println("Interruptingthread...");
thread.interrupt();
Thread.sleep(3000);
System.out.println("Stoppingapplication...");
System.exit(0);
}
publicvoidrun(){
while(true){
System.out.println("Threadisrunning...");
longtime=System.currentTimeMillis();
while(System.currentTimeMillis()-time<1000){
}
}
}
}
列表B:经由过程传送旌旗灯号中止线程
classExample2extendsThread{
volatilebooleanstop=false;
publicstaticvoidmain(Stringargs[])throwsException{
Example2thread=newExample2();
System.out.println("Startingthread...");
thread.start();
Thread.sleep(3000);
System.out.println("Askingthreadtostop...");
thread.stop=true;
Thread.sleep(3000);
System.out.println("Stoppingapplication...");
System.exit(0);
}
publicvoidrun(){
while(!stop){
System.out.println("Threadisrunning...");
longtime=System.currentTimeMillis();
while((System.currentTimeMillis()-time<1000)&&(!stop)){
}
}
System.out.println("Threadexitingunderrequest...");
}
}
列表C:经由过程Thread.interrupt()加入封闭形态
classExample3extendsThread{
volatilebooleanstop=false;
publicstaticvoidmain(Stringargs[])throwsException{
Example3thread=newExample3();
System.out.println("Startingthread...");
thread.start();
Thread.sleep(3000);
System.out.println("Askingthreadtostop...");
thread.stop=true;
thread.interrupt();
Thread.sleep(3000);
System.out.println("Stoppingapplication...");
System.exit(0);
}
publicvoidrun(){
while(!stop){
System.out.println("Threadrunning...");
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
System.out.println("Threadinterrupted...");
}
}
System.out.println("Threadexitingunderrequest...");
}
}
列表D:经由过程Thread.interrupt()中止I/O操纵
importjava.io.*;
classExample4extendsThread{
publicstaticvoidmain(Stringargs[])throwsException{
Example4thread=newExample4();
System.out.println("Startingthread...");
thread.start();
Thread.sleep(3000);
System.out.println("Interruptingthread...");
thread.interrupt();
Thread.sleep(3000);
System.out.println("Stoppingapplication...");
System.exit(0);
}
publicvoidrun(){
ServerSocketsocket;
try{
socket=newServerSocket(7856);
}catch(IOExceptione){
System.out.println("Couldnotcreatethesocket...");
return;
}
while(true){
System.out.println("Waitingforconnection...");
try{
Socketsock=socket.accept();
}catch(IOExceptione){
System.out.println("accept()failedorinterrupted...");
}
}
}
}
列表E:I/O操纵失利
importjava.net.*;
importjava.io.*;
classExample5extendsThread{
volatilebooleanstop=false;
volatileServerSocketsocket;
publicstaticvoidmain(Stringargs[])throwsException{
Example5thread=newExample5();
System.out.println("Startingthread...");
thread.start();
Thread.sleep(3000);
System.out.println("Askingthreadtostop...");
thread.stop=true;
thread.socket.close();
Thread.sleep(3000);
System.out.println("Stoppingapplication...");
System.exit(0);
}
publicvoidrun(){
try{
socket=newServerSocket(7856);
}catch(IOExceptione){
System.out.println("Couldnotcreatethesocket...");
return;
}
while(!stop){
System.out.println("Waitingforconnection...");
try{
Socketsock=socket.accept();
}catch(IOExceptione){
System.out.println("accept()failedorinterrupted...");
}
}
System.out.println("Threadexitingunderrequest...");
}
}
再说第三点:我并没有提到服务器也要整合,然后是IDE,一个好的IDE能够200%提高开发的速度,就说图形方面:你是经过简单托拽和点击就能实现功能好那。
作者:
冷月葬花魂
时间:
2015-1-21 13:20
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
作者:
小魔女
时间:
2015-1-25 14:31
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
作者:
因胸联盟
时间:
2015-2-7 09:55
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
作者:
admin
时间:
2015-2-7 18:14
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
作者:
简单生活
时间:
2015-2-8 07:48
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
作者:
再见西城
时间:
2015-2-10 16:59
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
作者:
若相依
时间:
2015-3-1 12:52
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
作者:
透明
时间:
2015-3-3 11:16
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
作者:
小女巫
时间:
2015-3-9 18:13
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
作者:
仓酷云
时间:
2015-3-12 16:35
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
作者:
活着的死人
时间:
2015-3-20 00:11
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
作者:
飘灵儿
时间:
2015-3-20 22:26
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
作者:
爱飞
时间:
2015-3-24 23:38
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
作者:
柔情似水
时间:
2015-4-3 01:54
是一种语言,用以产生「小应用程序(Applet(s))
作者:
山那边是海
时间:
2015-4-9 11:11
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
作者:
飘飘悠悠
时间:
2015-4-18 10:15
是一种使网页(Web Page)产生生动活泼画面的语言
作者:
只想知道
时间:
2015-4-27 00:35
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者:
老尸
时间:
2015-5-10 10:59
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
作者:
蒙在股里
时间:
2015-5-11 04:35
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2