线程简单总结:
a、线程的简单理解:程序中一个独立运行单位。有单线程和多线程之分;单线程就是我们平常用得比较多的调用、嵌套;而接下来就着重介绍多线程。
b、多线程:即多个程序同时进行,其数据互不干扰和影响;
这里还要介绍下进程:简单地说、一个程序就是一个进程;而线程是一个进程内部的多个运行单位。进程只能调用数据、而线程不仅可以调用数据而且还可以改变数据。
在单核CPU中、多线进程是通过时间的停顿来实现。
c、多线程的实现:其实现过程可分为以下方法:
1、继承Thread类实现继承:主要是在run方法中重写方法来编写线程要实现的调用。然后调用start()方法来启动线程;
例:
public class CountFileThread extends Thread{ private String path; private int count; private String rootDirName; //用构造器接收传递的路径和计数器 public CountFileThread(String path){ this.rootDirName=path; } //调用线程对象的start()方法后、线程就从它的 public void run(){ //定义一个当前时间的计时变量 long start=System.currentTimeMillis(); //调用文件统计方法 int fileCount=countDir(this.rootDirName); //定义一个变量,得到当前运行所花时间 long timeCost=System.currentTimeMillis()-start; //输出文件个数 System.out.println("磁盘"+this.rootDirName+"统计出的文件个数"+ fileCount+"/n统计所花时间:"+timeCost); } /* * path 所传递路径 * size 返回统计的文件个数 */ public int countDir(String path){ //用于统计文件个数 int size=0; //先实例化一个文件对象 File file=new File(path); //判断文件目录是否存在 if(!file.exists()){ return size; } //用数组将路径所在的文件存装 File[] subFile=file.listFiles(); //再进行判断列表子目录是否存在 if(subFile==null){ return size; } for(int i=0;i<subFile.length;i++){ //判断此文件是目录还是文件 if(subFile[i].isDirectory()){ //如果是目录,则进行递归调用 size+=countDir(subFile[i].getAbsolutePath()); } //如果是文件,则进行直接相加 else if(subFile[i].isFile()){ size++; } } return size; } }
2、实现Runnable接口创建线程:主要定义一个实现Runnable接口的类,实现run()方法、再将这个类的实例作为Thread的构造方法的参数,创建Thread类的实例;再启动线程。其接口主要区别是同时实现多个线程。
例:
// 实例化对象、是每个磁盘做为一个线程 File[] file = File.listRoots(); for (int i = 0; i < file.length; i++) { // 实例化对象 RunnableCount run = new RunnableCount(file[i].getAbsolutePath(), i + 1); // 磁盘中统计出的文件个数 // int count=run.countDir(file[i].getAbsolutePath()); // 构造Thread对象 Thread thread = new Thread(run); // 启动线程 thread.start(); }
3、以内部类的方式创建线程:即在一个方法中创建线程、当方法被调用时,线程即启用;此方法也能同时实现多个线程。
例:
* *这个方法会启动一个匿名匿名内部类线程 */ private void MyThread(final int i, final String path) { //实例化Runnable接口对象 Runnable run=new Runnable(){ public void run() { int count=countDir(path); System.out.println("第"+i+"个磁盘的文件总数是:"+count); } }; //最后启用这个内部线程 Thread thread=new Thread(run); thread.start();
[/size]