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; }}
贴图一张:
好了线程和多线程写到这里就差不多了,在这之后加以进一步的实践和思考,想必我们能更好的理解线程和多线程的概念并加以运用。
- java新手上路(五):线程,多线程
- PHP新手上路(五)
- PHP新手上路(五)
- JAVA新手上路之遇见线程
- 蚂蚁(java新手上路)
- java新手上路(二):奥特曼打怪兽
- java新手入门(新手上路策略篇)
- Java新手上路大全
- Java新手上路大全
- Java新手上路大全
- Java新手上路大全
- Java多线程之线程池(五)
- 新手上路(三)
- 新手学JAVA(十一)-多线程----线程的生命周期
- Java新手上路经验1
- java Properties 类新手上路
- Java开发新手上路三个月
- Java上路09-多线程
- 1.7-Java-冒泡排序
- SSO搭建(框架KISSO)
- Jmeter连接SqlServer数据库进行压力测试
- 归并排序
- python中的__new__概念(工厂
- java新手上路(五):线程,多线程
- Uva514——Rails
- HDU1201 18岁的生日
- Spring Boot整合jpa,Shiro进行权限管理
- 用学习曲线 learning curve 来判别过拟合问题
- Libgdx中ScrollPane和Actor事件冲突问题的解决方案
- stm32应用笔记和数据手册
- 1006 Sign In and Sign Out (25)
- 在虚拟机上安装5节点Hadoop分布式集群(HA)-环境准备