java新手上路(五):线程,多线程

来源:互联网 发布:sql应用程序在哪里 编辑:程序博客网 时间:2024/05/16 07:59

关于线程,
我知道的,不多;
为了程序曾经去过那里;
多少次在bug中路过这线程;
一个人悄悄地,改代码。

关于线程,我想的全是你,
想来想去都是出错和委屈;
关于线程,我“唉”的全是你,
“唉”来“唉”去不明白什么道理。

到底什么是线程,多线程到底是个什么鬼。我曾在数十次唉声叹气中都不懂这个难题。
我想要搞懂这个概念,势必要说出另一个让人懵比的词:程序。

兄弟,那么程序到底是什么。这是个值得思考的问题。百度会告诉你程序是一串CPU能看懂的指令,但是世界上所有的问题都没有标准的答案吧。

在我看来,程序就是一串一串的代码加上能够让它跑起来的别的什么东西。就好像一辆车,代码是车上的零件;运行的环境就是燃油和机油;CPU和内存就是大马路咯,那么出了bug大概就是违章被警察叔叔给扣起来了,嘿嘿!

那么问题来了!我们讲线程,那么线程是这个车的什么部分呢。先问下度娘吧,度娘跟我说:线程是CPU独立运行和独立调度的基本单位(可以理解为一个进程中执行的代码片段)。

嗯,跟没说一样,说了我也不懂。于是我机智的大脑告诉我,线程不就是车道吗!哦,可以这么理解吗?(黑人懵比)
好吧,按照这个理解我们进一步研究,百度又告诉我:线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
嗯,我几乎快放弃百度了,在我绞尽脑汁之后,我发现原来不能把程序比作一辆车,神,程序其实是一个并排飚车的车队啊。这个车队里面的每一辆车都需要一个线程,在CPU和内存的大马路上狂野的驰骋。线程就是他们的车道,飞翔吧,藤原拓海!

这样一来,我就理解了(虽然我扯了这么多看客们可能更加懵比了,管他呢,我自己看得懂就行,嘿嘿)。

好啦理解到这里看似就差不多了,可是还有一个问题。在我们的电脑上,其实,线程们并不是实际意义上的同时运行着的。这其实在我们使用的诸多软件里面也是同样的道理。

关键词:时分复用。大概是这个意思,不知道有没有更加专业点的词来形容这个状态。也就是说,我们在同时打开很多软件或者线程的时候,他们并不能同时运行。电脑会把一个单位的时间不均等的分配给每一个需要运行的线程。比如我打开的扫雷和QQ,可能的情况就是扫雷的线程给了1ms的时间,然后QQ再给3ms的时间。

为了更好的理解这个意思,我们回到刚才的比喻:那么现在的话,这些车或者车队,他们都不能自己动起来,需要一只上帝之手来推动他们,遗憾的是上帝现在只有一只手有空,所以上帝只能够先把拓海的车推个几毫秒,再把文太(拓海他爸)的车推个几毫秒。这样子看起来就像是同时运行着的了!辛苦了上帝!!!

好了,说了这么多,举个简单的例子吧,

用线程做一个能够搜索根目录下文件数目的程序。

举例之前有两点要注意的,在java中,我们所写的程序都是通过java虚拟机所提供的线程来实现的。我们自己能使用的多线程在Runnable接口中

    public abstract void run();}

java为我们提供的Thread类实现-了Runnable接口,所以我们在实际运用的时候即可以直接实现Runnable接口,也可以通过继承Thread类来实现Runable,但无论怎样重点都在于run()的重写!

//下面是所举的例子:import java.io.File;//先写一个countdisk搜索磁盘文件数目的类,在这里面调用搜索类public class countdisk extends Thread{    public static void main(String[] Args){//建立文件类数组f存储根目录下的文件        File[] f =File.listRoots();//开始调用多线程完成搜索        for(int i=0 ;i<f.length ;i++){        searchfile sf =new searchfile(f[i].getAbsolutePath());        sf.start();        }        System.out.println("搜索进程已经开始!");    }}
import java.io.File;//searchfile类用于在多线程中查找文件数目public class searchfile extends Thread{//roorfile为根目录绝对路径    private String rootfile;        public searchfile(String strpath){            this.rootfile =strpath;        }    //在run方法中调用查找文件数目的方法        public void run(){            int filecount =countfile(this.rootfile);            System.out.println("根目录:"+this.rootfile+"有"+filecount+"个文件.");        }//countfile为查找rootfile根目录中文件数目的方法,其中用到了递归的思想。        public int countfile(String rootfile){//count为文件数目,初始值设为0;            int count =0;            File f =new File(rootfile);//判断目录是否存在,不存在则返回0;            if(!f.exists())                return 0;//将目录下的目录或文件存入fs数组;            File[] fs =f.listFiles();//如果该目录下没有目录或文件,则返回0;            if(fs ==null)                return 0;//开始对目录下的子目录或文件进行遍历            for(int i =0 ;i<fs.length ;i++){//如果是目录,则将子目录的绝对路径作为参数进行countfile;                if(fs[i].isDirectory())                    count += countfile(fs[i].getAbsolutePath());//如果是文件,则count++                if(fs[i].isFile())                    count++;            }            return count;        }}

贴图一张:
这里写图片描述
好了线程和多线程写到这里就差不多了,在这之后加以进一步的实践和思考,想必我们能更好的理解线程和多线程的概念并加以运用。