您的位置:首页 > 编程语言 > Java开发

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

2017-07-27 11:55 232 查看
关于线程,

我知道的,不多;

为了程序曾经去过那里;

多少次在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;
}

}


贴图一张:



好了线程和多线程写到这里就差不多了,在这之后加以进一步的实践和思考,想必我们能更好的理解线程和多线程的概念并加以运用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java