多线程实例详解
来源:互联网 发布:数据分析一般流程 编辑:程序博客网 时间:2024/05/17 22:02
多线程的概念在此就不多说了,打个通熟易懂比方,把自己看做一个进程,做的每件事都看做为线程,自己可以同时玩魔兽和听歌,那么玩魔兽和听歌就是两个线程,为多线程。
java是少数集中支持多线程的语言之一,大多数的语言只能运行一个程序块,无法同时运行不同的程序块,而java则弥补了这个缺陷。
举个公司项目开发遇到的一个简单例子,用户上传压缩文件到服务器后,要对该压缩包进行两个操作,一是将该压缩包复制到指定目录,一是将该压缩包解压到另一指定目录,最终响应用户提示文件上传成功。如果压缩包很大的话,上传后进行的复制和解压功能也会占用很长时间,用户就会等待很长的时间。其实复制和解压的功能和用户操作没有直接关系,完全可以独立出来,其解决的思路如下:
java是少数集中支持多线程的语言之一,大多数的语言只能运行一个程序块,无法同时运行不同的程序块,而java则弥补了这个缺陷。
举个公司项目开发遇到的一个简单例子,用户上传压缩文件到服务器后,要对该压缩包进行两个操作,一是将该压缩包复制到指定目录,一是将该压缩包解压到另一指定目录,最终响应用户提示文件上传成功。如果压缩包很大的话,上传后进行的复制和解压功能也会占用很长时间,用户就会等待很长的时间。其实复制和解压的功能和用户操作没有直接关系,完全可以独立出来,其解决的思路如下:
当用户上传压缩文件完毕之后,我们立即创建两个线程,一是复制压缩文件的线程;二是解压压缩文件的线程。我们可以通过线程的构造方法把文件的信息传递给相应的线程,当我们启动两线程的start方法后,我们就不必再关心其复制和解压的操作,而是直接响应用户,这样用户明显感觉操作变快,而复制和解压的操作仍在后台偷偷的进行着。
实现多线程的方法有两个,一是继承Thread,二是实现接口Runnable。二者的区别不多说,继承只能单继承,而接口可以实现多个,故本人更倾向使用后者。
下面把代码模型贴出来,供大家参考参考:
package com.yjd.test;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) + "毫秒");}}/** * 上传文件类 * * @author yangjd * */class UploadFile {// 文件上传public File uploadFileMethod() {File file = new File("filePath");System.out.println("文件上传完毕");return file;}}/** * 复制文件类 * * @author yangjd * */class CoppyFile implements Runnable {private File file;public CoppyFile(File file) {this.file = file;}@Overridepublic void run() {coppyFileMethod(file);}// 文件复制public void coppyFileMethod(File file) {// 睡眠15秒钟try {Thread.sleep(15000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("文件复制完毕");}}/** * 解压文件类 * * @author yangjd * */class UnZipFile implements Runnable {private File file;public UnZipFile(File file) {this.file = file;}@Overridepublic void run() {unZipFileMethod(file);}// 文件解压public void unZipFileMethod(File file) {// 睡眠10秒钟try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("文件解压完毕");}}
- 多线程实例详解
- JAVA多线程实例详解
- 多线程原理实例应用详解
- JAVA 多线程爬虫实例详解
- 多线程编程实例---pthread_join函数详解1
- 多线程编程实例---pthread_join函数详解
- 多线程编程实例---pthread_join函数详解1
- PHP Curl多线程原理实例详解
- Java 多线程实例详解(二)
- Java 多线程实例详解(三)
- 详解 QT 多线程 TCP 文件接收服务器实例(2)
- 详解 QT 多线程 TCP 文件接收服务器实例(2)
- 详解 QT 多线程 TCP 文件接收服务器实例(1)
- 【Java工程师之路】[1-4.4]Java多线程实例详解
- 多线程函数系列pthread_create(), pthread_join(), pthread_self(),pthread_exit(), pthread_detach()实例详解
- 多线程实例
- 多线程实例
- 多线程实例
- View 变Table 优化MySql
- perl 解析xml 常用链接
- JAVA解析URL工具类
- 2011回顾之接口性能测试<学习借鉴>
- FlashBuilder找不到所需要的AdobeFlashPlayer调试器版本的解
- 多线程实例详解
- OK6410内核移植笔记
- Spring AOP+ehCache简单缓存系统解决方案
- js点击类图片预览
- QT 类及其实现效果(4)--字体设置
- System::Text::StringBuilder::AppendFormat' : no overloaded function takes 7 arguments
- struct2中json配置ajax
- Ruby 实现base64加密和解密
- js监听输入框值的即时变化onpropertychange、oninput