博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程实例
阅读量:5982 次
发布时间:2019-06-20

本文共 2649 字,大约阅读时间需要 8 分钟。

多线程的概念在此就不多说了,打个通熟易懂比方,把自己看做一个进程,做的每件事都看做为线程,自己可以同时玩魔兽和听歌,那么玩魔兽和听歌就是两个线程,为多线程。

    java是少数集中支持多线程的语言之一,大多数的语言只能运行一个程序块,无法同时运行不同的程序块,而java则弥补了这个缺陷。
    举个公司项目开发遇到的一个简单例子,用户上传压缩文件到服务器后,要对该压缩包进行两个操作,一是将该压缩包复制到指定目录,一是将该压缩包解压到另一指定目录,最终响应用户提示文件上传成功。如果压缩包很大的话,上传后进行的复制和解压功能也会占用很长时间,用户就会等待很长的时间。其实复制和解压的功能和用户操作没有直接关系,完全可以独立出来,其解决的思路如下:
    当用户上传压缩文件完毕之后,我们立即创建两个线程,一是复制压缩文件的线程;二是解压压缩文件的线程。我们可以通过线程的构造方法把文件的信息传递给相应的线程,当我们启动两线程的start方法后,我们就不必再关心其复制和解压的操作,而是直接响应用户,这样用户明显感觉操作变快,而复制和解压的操作仍在后台偷偷的进行着。

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

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

import java.io.File; public class FileOperate {     public static void main(String[] args) {         Long begin = System.currentTimeMillis();          // 上传文件         UploadFile uploadFile = new UploadFile();         File file = uploadFile.uploadFileMethod();         // 给线程传递参数         CoppyFile coppyFile = new CoppyFile(file);         UnZipFile unZipFile = new UnZipFile(file);         // 创建线程         Thread coppyThread = new Thread(coppyFile);         Thread unZipThread = new Thread(unZipFile);         // 启动线程         coppyThread.start();         unZipThread.start();          Long end = System.currentTimeMillis();         // 响应用户请求         System.out.println("恭喜,文件上传成功,耗时:" + (end - begin) + "毫秒");     } }  /** * 上传文件类 *  */ class UploadFile {     // 文件上传     public File uploadFileMethod() {         File file = new File("filePath");         System.out.println("文件上传完毕");         return file;     } }  /** * 复制文件类 *  */ class CoppyFile implements Runnable {     private File file;      public CoppyFile(File file) {         this.file = file;     }      @Override     public void run() {         coppyFileMethod(file);     }      // 文件复制     public void coppyFileMethod(File file) {         // 睡眠15秒钟         try {             Thread.sleep(15000);         } catch (InterruptedException e) {             e.printStackTrace();         }         System.out.println("文件复制完毕");     } }  /** * 解压文件类 *  */ class UnZipFile implements Runnable {     private File file;      public UnZipFile(File file) {         this.file = file;     }      @Override     public void run() {         unZipFileMethod(file);      }      // 文件解压     public void unZipFileMethod(File file) {         // 睡眠10秒钟         try {             Thread.sleep(10000);         } catch (InterruptedException e) {             e.printStackTrace();         }         System.out.println("文件解压完毕");     } }

 

在此说明一个问题:

线程的run()与start()的区别:

执行run()方法方法是简单的方法调用,而不在重新启动一个线程。
而执行start()方法,才是将待执行的方法放入线程池中,等待抢锁,再执行。
故,我们在使用implements Runnable来实现一个线程类时,需要使用new Thread(t).start()来启动线程,而非直接调用run()方法。
(可以通过程序调试来看出端倪。)

 

 

<引:>

转载地址:http://dleox.baihongyu.com/

你可能感兴趣的文章
基于 Redis 的分布式锁
查看>>
STL学习-vector
查看>>
java9系列(八)Multi-Release JAR Files
查看>>
70行python代码实现壁纸批量下载
查看>>
可能是最详细的部署:Docker Registry企业级私有镜像仓库Harbor管理WEB UI
查看>>
在 React 工程中利用 Mota 编写面向对象的业务模型
查看>>
Cocos Creator—最佳构建部署实践
查看>>
从零开始打造自己的PHP框架——第4章
查看>>
SpringBoot 1024行代码 - Eureka Server
查看>>
走近 Python (类比 JS)
查看>>
ELSE 技术周刊(2017.11.13期)
查看>>
HTTP/2 服务器推送(Server push)实践
查看>>
Node 错误处理之挖坑系列
查看>>
vue 项目开发 lenovo商城
查看>>
来自crush的中序遍历完全二叉树
查看>>
生产环境项目部署目录
查看>>
Laravel 5.5 中文文档翻译完成(包含文档离线下载地址)
查看>>
关于javascript中的作用域和作用域链
查看>>
iView 一周年了,同时发布了 2.0 正式版,但这只是开始...
查看>>
.Net Performance[译]
查看>>