答疑一个哥们的多线程问题关于 start()和run()


之所以出现线程,就是为了更好的利用CPU,让她更加“精明”的干活。

Thread 是通过调用Thread 的start()方法来启动一个线程的(这时此线程是处于就绪状态,并没有运行),如果直接用Run方法,这只是调用一个方法而已,程序中依然只有主线程--这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的。

然后通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程终止,而CPU再运行其它线程,线程就是为了更好地利用CPU,提高程序运行速率的!

 

解读源码:

start为线程入口,通过它启动线程

[java]  view plain  copy
 print ?
  1. public synchronized void start() {  
  2.         if (started)  
  3.             throw new IllegalThreadStateException();  
  4.         started = true;  
  5.         group.add(this);  
  6.         start0();  
  7. }  

run为实际代码执行段,如果在程序中直接调用run的话就变成了普通方法,因为没有将它加入到线程组中如果你用run,就会发现程序会假死,因为它只是一个常规方法的调用,还是用的main这个线程

 

举个例子吧:

    多线程的概念在此就不多说了,打个通熟易懂比方,把自己看做一个进程,做的每件事都看做为线程,自己可以同时玩魔兽和听歌,那么玩魔兽和听歌就是两个线程,为多线程。
    Java是少数集中支持多线程的语言之一,大多数的语言只能运行一个程序块,无法同时运行不同的程序块,而java则弥补了这个缺陷。
    举个公司项目开发遇到的一个简单例子,用户上传压缩文件到服务器后,要对该压缩包进行两个操作,一是将该压缩包复制到指定目录,一是将该压缩包解压到另一指定目录,最终响应用户提示文件上传成功。如果压缩包很大的话,上传后进行的复制和解压功能也会占用很长时间,用户就会等待很长的时间。其实复制和解压的功能和用户操作没有直接关系,完全可以独立出来,其解决的思路如下:

    当用户上传压缩文件完毕之后,我们立即创建两个线程,一是复制压缩文件的线程;二是解压压缩文件的线程。我们可以通过线程的构造方法把文件的信息传递给相应的线程,当我们启动两线程的start方法后,我们就不必再关心其复制和解压的操作,而是直接响应用户,这样用户明显感觉操作变快,而复制和解压的操作仍在后台偷偷的进行着。

    实现多线程的方法有两个,一是继承Thread,二是实现接口Runnable。二者的区别不多说,继承只能单继承,而接口可以实现多个,故本人更倾向使用后者。

下面把代码模型贴出来,供大家参考参考:

[java]  view plain  copy
 print ?
  1. package com.bankht.test;  
  2.   
  3. import java.io.File;  
  4.   
  5. /** 
  6.  * @author: 特种兵—AK47 
  7.  * @创建时间:2012-6-27 上午09:49:56 
  8.  *  
  9.  * @类说明 :多线程实例详解 . 
  10.  */  
  11. public class FileOperate {  
  12.     public static void main(String[] args) {  
  13.         Long begin = System.currentTimeMillis();  
  14.         // 上传文件  
  15.         UploadFile uploadFile = new UploadFile();  
  16.         File file = uploadFile.uploadFileMethod();  
  17.         // 给线程传递参数  
  18.         CoppyFile coppyFile = new CoppyFile(file);  
  19.         UnZipFile unZipFile = new UnZipFile(file);  
  20.         // 创建线程  
  21.         Thread coppyThread = new Thread(coppyFile);  
  22.         Thread unZipThread = new Thread(unZipFile);  
  23.         // 启动线程  
  24.         coppyThread.start();  
  25.         unZipThread.start();  
  26.   
  27.         Long end = System.currentTimeMillis();  
  28.         // 响应用户请求  
  29.         System.out.println("恭喜,文件上传成功,耗时:" + (end - begin) + "毫秒");  
  30.     }  
  31. }  
  32.   
  33. /** 
  34.  * 上传文件类 
  35.  */  
  36. class UploadFile {  
  37.     // 文件上传  
  38.     public File uploadFileMethod() {  
  39.         File file = new File("filePath");  
  40.         System.out.println("文件上传完毕");  
  41.         return file;  
  42.     }  
  43. }  
  44.   
  45. /** 
  46.  * 复制文件类 
  47.  */  
  48. class CoppyFile implements Runnable {  
  49.     private File file;  
  50.   
  51.     public CoppyFile(File file) {  
  52.         this.file = file;  
  53.     }  
  54.   
  55.     @Override  
  56.     public void run() {  
  57.         coppyFileMethod(file);  
  58.     }  
  59.   
  60.     // 文件复制  
  61.     public void coppyFileMethod(File file) {  
  62.         Long begin = System.currentTimeMillis();  
  63.         // 睡眠15秒钟  
  64.         try {  
  65.             Thread.sleep(5 * 1000);  
  66.         } catch (InterruptedException e) {  
  67.             e.printStackTrace();  
  68.         }  
  69.         Long end = System.currentTimeMillis();  
  70.         // 响应用户请求  
  71.         System.out.println("文件复制完毕,耗时:" + (end - begin) + "毫秒");  
  72.     }  
  73. }  
  74.   
  75. /** 
  76.  * 解压文件类 
  77.  */  
  78. class UnZipFile implements Runnable {  
  79.     private File file;  
  80.   
  81.     public UnZipFile(File file) {  
  82.         this.file = file;  
  83.     }  
  84.   
  85.     @Override  
  86.     public void run() {  
  87.         unZipFileMethod(file);  
  88.   
  89.     }  
  90.   
  91.     // 文件解压  
  92.     public void unZipFileMethod(File file) {  
  93.         Long begin = System.currentTimeMillis();  
  94.         // 睡眠10秒钟  
  95.         try {  
  96.             Thread.sleep(3 * 1000);  
  97.         } catch (InterruptedException e) {  
  98.             e.printStackTrace();  
  99.         }  
  100.         Long end = System.currentTimeMillis();  
  101.         // 响应用户请求  
  102.         System.out.println("文件解压一部分,耗时:" + (end - begin) + "毫秒");  
  103.         try {  
  104.             Thread.sleep(3 * 1000);  
  105.         } catch (InterruptedException e) {  
  106.             e.printStackTrace();  
  107.         }  
  108.         Long end1 = System.currentTimeMillis();  
  109.         System.out.println("文件解压完毕,耗时:" + (end1 - begin) + "毫秒");  
  110.     }  
  111. }  


运行一下:

[html]  view plain  copy
 print ?
  1. 文件上传完毕  
  2. 恭喜,文件上传成功,耗时:15毫秒  
  3. 文件解压一部分,耗时:3000毫秒  
  4. 文件复制完毕,耗时:5000毫秒  
  5. 文件解压完毕,耗时:6000毫秒  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值