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

关于线程,
我知道的,不多;
为了程序曾经去过那里;
多少次在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;
        }

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值