Java基本功之中断线程的理解.doc

Java基本功之中断线程的理解.doc

ID:51690274

大小:43.45 KB

页数:6页

时间:2020-03-15

Java基本功之中断线程的理解.doc_第1页
Java基本功之中断线程的理解.doc_第2页
Java基本功之中断线程的理解.doc_第3页
Java基本功之中断线程的理解.doc_第4页
Java基本功之中断线程的理解.doc_第5页
资源描述:

《Java基本功之中断线程的理解.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java 基本功之中断线程的理解有的时候我们需要一种规范的思路,使用规范的方法来解决一类问题。  我们首先要明白,线程终止的条件,有三种情况:  1.当线程的run方法执行方法体中最后一条语句后。  2.当执行retutrn语句返回时。  3.当出现了在方法中没有捕获的异常时。  在Java的早期版本中,还有一个stop方法,其他线程可以调用它终止线程,但是这个方法已经被弃用了,所以还在用的同学就不要继续用了。  我们的正确思路是,使用interrupt方法来终止我们的线程。  首先要理解interrupt方法做了什么:每一个线程都有一个中断状态,这是一个boolean标志,当线程调用了in

2、terrupt方法时,这个中断状态就会被置位。如果我们要检查中断状态,可以使用Thread.currentThread()。isInterrupted()来获得是否中断。  但是如果线程被阻塞了(sleeporwait),当我们调用了interrupt方法的时候,就会产生InterruptedException异常。这是我们可以利用的地方。  同样的,如果中断状态先被置位了,然后我们调用了sleep方法,线程不会休眠,相反,它将清除中断状态,然后抛出InterruptedException.  我们调用了interrupt并不意味着线程会终止,线程是否会终止,以及会如何继续,是程序员来控制的

3、。  在本文中我们将会讨论终止线程的规范用法,然后在一个例子中实际应用,在这个例子中我们模拟了文件拷贝和游戏绘图两种情形。做出的效果如下图所示,点击start后上方进度条会显示文件拷贝的进度,点击end则会停止拷贝。点击draw会在画面中不停绘制各种各样的矩形,点击stop则会停止绘制。  首先我们来看两种情形的后台线程写法:  publicvoidrun(){  try{  …  while(!Thread.currentThread.isInterrupted()&&moreworktodo)  {  domorework  }  }  catch(InterruptedExceptio

4、n)  {  //threadwasinterruptedduringsleeporwait  }  finally  {  cleanup,ifrequired  }  //exitingtherunmethodterminatesthethread}  publicvoidrun(){  try{  …  while(moreworktodo)  {  domorework  Thread.sleep(delay);  }  }  catch(InterruptedException)  {  //threadwasinterruptedduringsleeporwait  }  fin

5、ally  {  cleanup,ifrequired  }  //exitingtherunmethodterminatesthethread}  第一种写法适用于后台下载,文件拷贝以及类似情形,第二种写法适合游戏画面刷新或者类似情形。  第一种写法利用了interrupt方法,作为终止的请求,使得循环跳出,run方法执行完毕。而第二种方法则是利用当线程sleep的时候调用interrupt会抛出InterruptedException从而跳出了循环进而线程执行到结束。  事实上这两种写法的区别就在于第二种使用了sleep.在我们的使用示例中,对应这两种方法的使用代码如下:  这一段是实现

6、文件拷贝的:  privateclassCopyRunnableimplementsRunnable{  @Override  publicvoidrun(){  FilefromFile=newFile(Environment.getExternalStorageDirectory()  .getAbsolutePath()+"/abc.exe");  longfileLength=fromFile.length();  longcopyedLength=0;  FiletoFile=newFile(Environment.getExternalStorageDirectory()  .g

7、etAbsolutePath()+"/abc_.exe");  if(toFile.exists()){  toFile.delete();  }  try{  FileInputStreamfileInputStream=newFileInputStream(fromFile);  FileOutputStreamfileOutputStream=newFileOutputStream(  toFile,t

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。