答疑一个哥们的多线程问题关于 start()和run()
2016-12-09 17:32
417 查看
之所以出现线程,就是为了更好的利用CPU,让她更加“精明”的干活。
Thread 是通过调用Thread 的start()方法来启动一个线程的(这时此线程是处于就绪状态,并没有运行),如果直接用Run方法,这只是调用一个方法而已,程序中依然只有主线程--这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的。然后通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程终止,而CPU再运行其它线程,线程就是为了更好地利用CPU,提高程序运行速率的!
解读源码:
start为线程入口,通过它启动线程
[java] view
plain copy
print?
public synchronized void start() {
if (started)
throw new IllegalThreadStateException();
started = true;
group.add(this);
start0();
}
run为实际代码执行段,如果在程序中直接调用run的话就变成了普通方法,因为没有将它加入到线程组中如果你用run,就会发现程序会假死,因为它只是一个常规方法的调用,还是用的main这个线程
举个例子吧:
多线程的概念在此就不多说了,打个通熟易懂比方,把自己看做一个进程,做的每件事都看做为线程,自己可以同时玩魔兽和听歌,那么玩魔兽和听歌就是两个线程,为多线程。
Java是少数集中支持多线程的语言之一,大多数的语言只能运行一个程序块,无法同时运行不同的程序块,而java则弥补了这个缺陷。
举个公司项目开发遇到的一个简单例子,用户上传压缩文件到服务器后,要对该压缩包进行两个操作,一是将该压缩包复制到指定目录,一是将该压缩包解压到另一指定目录,最终响应用户提示文件上传成功。如果压缩包很大的话,上传后进行的复制和解压功能也会占用很长时间,用户就会等待很长的时间。其实复制和解压的功能和用户操作没有直接关系,完全可以独立出来,其解决的思路如下:
当用户上传压缩文件完毕之后,我们立即创建两个线程,一是复制压缩文件的线程;二是解压压缩文件的线程。我们可以通过线程的构造方法把文件的信息传递给相应的线程,当我们启动两线程的start方法后,我们就不必再关心其复制和解压的操作,而是直接响应用户,这样用户明显感觉操作变快,而复制和解压的操作仍在后台偷偷的进行着。
实现多线程的方法有两个,一是继承Thread,二是实现接口Runnable。二者的区别不多说,继承只能单继承,而接口可以实现多个,故本人更倾向使用后者。
下面把代码模型贴出来,供大家参考参考:
[java] view
plain copy
print?
package com.bankht.test;
import java.io.File;
/**
* @author: 特种兵—AK47
* @创建时间:2012-6-27 上午09:49:56
*
* @类说明 :多线程实例详解 .
*/
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) {
Long begin = System.currentTimeMillis();
// 睡眠15秒钟
try {
Thread.sleep(5 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Long end = System.currentTimeMillis();
// 响应用户请求
System.out.println("文件复制完毕,耗时:" + (end - begin) + "毫秒");
}
}
/**
* 解压文件类
*/
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) {
Long begin = System.currentTimeMillis();
// 睡眠10秒钟
try {
Thread.sleep(3 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Long end = System.currentTimeMillis();
// 响应用户请求
System.out.println("文件解压一部分,耗时:" + (end - begin) + "毫秒");
try {
Thread.sleep(3 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Long end1 = System.currentTimeMillis();
System.out.println("文件解压完毕,耗时:" + (end1 - begin) + "毫秒");
}
}
运行一下:
[html] view
plain copy
print?
文件上传完毕
恭喜,文件上传成功,耗时:15毫秒
文件解压一部分,耗时:3000毫秒
文件复制完毕,耗时:5000毫秒
文件解压完毕,耗时:6000毫秒
相关文章推荐
- 答疑一个哥们的多线程问题关于 start()和run()
- 一个关于startActivityForResult的小问题
- 【原创】关于SPSecurity.RunWithElevatedPrivileges的一个问题[A problem about SPSecurity.RunWithElevatedPrivileges]
- 多线程的问题start和run方法的区别
- 关于多线程的start()和run()方法
- 关于开发低端安卓手机的一个坑之startActivityForResult原Activity被回收的问题
- 一个关于多线程对象释放的问题
- 关于多线程出现安全问题的一个小示例
- 一个关于Schema的问题,请求帮助
- 一个关于bin目录下DLL动态编译的问题
- java 中关于package的一个问题
- 关于统计的一个sql问题,使用动态sql语句实现。
- DataGuard - 一个关于Physical Standby中recover问题的解决方法
- DataGuard - 一个关于Physical Standby中recover问题的解决方法
- 关于CreateService的一个大问题:权限问题
- 关于数据库备份的一个问题??
- 关于C语言For循环的一个问题~!
- 一个我很长时间才解决的关于xp与2000共享的网络问题
- 发现一个奇怪的问题,关于文件名
- 关于SQL的存储过程一个悬而未决的老问题