`
huangfeiNetJava
  • 浏览: 39576 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

多线程初步总结

 
阅读更多

什么是程序

      程序(program)是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合。为实现预期目的而进行操作的一系列语句和指令。一般分为系统程序和应用程序两大类。

      每一个程序在内存中都是以文件的形式存储的。

     

 

什么是进程

      对应用程序来说,进程就像一个大容器。在应用程序被运行后,就相当于将应用程序装进容器里了,你可以往容器里加其他东西(如:应用程序在运行时所需的变量数据、需要引用的DLL文件等),当应用程序被运行两次时,容器里的东西并不会被倒掉,系统会找一个新的进程容器来容纳它。

      进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,它是操作系统动态执行的基本单元。

      进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。

进程的特征  

     动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。

  并发性:任何进程都可以同其他进程一起并发执行

  独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;

  异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进

  结构特征:进程由程序、数据和进程控制块三部分组成。

  多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。

 

 

什么是线程

      线程,有时被称为轻量级进程,是程序执行流的最小单元

      线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

      每一个程序都至少有一个线程,那就是程序本身。

  线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程

 

引入线程的好处

 

     1 创建一个新线程花费的时间少。

  2 两个线程的切换时间少。

  3 由于同一个进程内的线程共享内存和文件,所以线程之间互相通信必须调用内核。

  4 线程能独立执行,能充分利用和发挥处理机与外围设备并行工作的能力

 

 

关于程序并发执行

      在大多数计算问题中,仅要求操作在时间上是部分有序的。有些操作必须在其他操作之后执行,另外有些操作却可以并行地执行。

无论是操作系统自身的程序还是用户程序,通常总是存在一些相对独立、但又能并发执行的程序段。

  为了合理利用系统资源,更好地发挥各种资源的效益,使各种物理设备之间的时间性限制条件减少到最低限度,最大限度地提高系统的效率,因而引出了多道程序方法。其实质是减少程序的顺序性,提高系统的并行性。

 

 

线程调度与优先级 

     有线程进入了就绪状态,需要有线程调度程序来决定何时执行,根据优先级来调度。


 

主线程

 

      当一个程序启动时,就有一个进程被操作系统(OS)创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程(Main Thread),因为它是程序开始时就执行的,如果你需要再创建线程,那么创建的线程就是这个主线程的子线程。每个进程至少都有一个主线程。

 

主线程的重要性体现在两方面:

      1.是产生其他子线程的线程;

      2.通常它必须最后完成执行比如执行各种关闭动作。

 

线程的定义方法

     1.继承Thread类,重写run方法;

     2.实现Runnable接口,具体化run方法。

 

代码示例:

package cn.July.day31.多线程;
import java.io.File;
/***
 * 统计某个磁盘文件数量的线程类
 */
public class CountFileTread extends Thread {

	/***
	 * 构造器,传入一个根目录名
	 */
	public CountFileTread(String rootDirName) {
		this.rootDirName = rootDirName;
	}

	// 线程执行入口:调用线程对象的start()方法后,线程就从它的run方法开始独立执行
	public void run() {
		long start = System.currentTimeMillis();
		int fileCount = countDir(this.rootDirName);
		long timeCount = System.currentTimeMillis() - start;
		System.out.println("-----驱动器:" + this.rootDirName + "统计完毕:"
				+ "  ;共有文件数量:" + fileCount + "   ;用时(单位:秒):" + timeCount/1000);
	}
	/***
	 * 计算一个目录下面所有文件的长度
	 * @param rootDirName2:要计算的目录名
	 *@return 文件的总长度
	 */

	private int countDir(String rootDirName2) {
		int count  = 0;
		//新建文件类对象
		File dirFile = new File(rootDirName2);
		//如果文件不存在直接返回
		if(!dirFile.exists()){
			return count;
		}
		//获得根目录
		File[] subFile = dirFile.listFiles();
		if(subFile == null){
			return count;
		}
		for(int i = 0;i<subFile.length;i++){
			if(subFile[i].isDirectory()){
				//如果文件类型是目录,则递归本方法
				count+=countDir(subFile[i].getAbsolutePath());
			}
			else if(subFile[i].isFile()){
				//如果文件类型是一般文件的话,计数加一
				count++;
			}
			
		}
		return count;
	}

	private String rootDirName;
}

 

主函数类:

package cn.July.day31.多线程;
import java.io.File;

public class MainCount {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//取得磁盘目录数组
		File[] rootFile = File.listRoots();
		//根据根目录个数启动线程
		for(int i = 0;i<rootFile.length;i++){
			//创建类对象
			CountFileTread countFile = new CountFileTread(rootFile[i].getAbsolutePath());
			//调用start方法,run开始执行
			countFile.start();
		}
		System.out.println(rootFile.length+"个统计线程对象已启动!");
	}
}

 

 

 

分享到:
评论

相关推荐

    自己总结的多线程

    多线程 , java,多线程并发,对于多线程的原理以及使用做了初步的介绍

    java_learning_practice:java进阶之路:面试高频算法,akka,多线程,NIO,Netty,SpringBoot,Spark && Flink等

    java_learning_practice学习java的积累示例:面试高频算法,akka,多线程,zookeeper,Disruptor,NIO,Netty,Thrift等项目组成收集总结初步&&大数据方向看到的优秀文章和系列博客;不定期更新pdf阿卡口味akka学习...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段04讲、多线程的休息室WaitSet详细介绍与知识点总结.mp4 │ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段04讲、多线程的休息室WaitSet详细介绍与知识点总结.mp4 │ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好的例子.mp4 │ 高并发编程第二阶段06讲、Java内存模型以及CPU缓存不一致...

    游戏编程--大师技巧

     多任务和多线程  按照Microsoft方式编程:匈牙利符号表示法  世界上最简单的Windows程序  真实的Windows应用程序  Windows类  注册Windows类  创建窗口  事件处理程序  主事件循环  产生一个实时事件循环...

    JAVA+android学习思维导图.7z

    7、多线程.mmap 8、IO.mmap 9、Collection.mmap 10、搜索引擎的使用方法.mmap 11、NDK初步.mmap 二、android部分 1、Androidd用用基础原理概要.mmap 2、Activity.mmap 3、Android中的service.mmap 4、Content ...

    精通Visual C++实效编程280例 源码

     本书通过280个精选的例子从各个方面讲述了如何利用Visual C++开发应用程序,涵盖了窗口、菜单和光标、控制栏、对话框、框架和文档视图、通用控件、GDI、文件、打印、多线程、网络、ADO数据库、动态链接库、系统、...

    基于OpenCV的精度测量项目实战.zip

    8、界面设计要点和多线程。 和现有界面库Goimageshop进行结合(很多界面的设置可以配合来讲,MFC中逻辑坐标和物理坐标之间转换这个也是可以讲的)。 9、显示控制和数据结果的导出,如何设计相关方法,将处理结果导出 ...

    java-learning:逐步打造在线最佳的Java学习笔记,包括博客讲解和源码实例,包括Java SE和Java Web

    初步打造在线最佳的Java学习笔记,笔记内容主要是对一些基础特性和编程细节进行总结整理,适合了解Java基础语法,想进一步深入学习的人 含博客讲解和二进制实例,采用maven构建,分模块学习,涉及反射,代理,多线程...

    JAVA基础课程讲义

    通过Runnable接口实现多线程 169 线程状态和sleep/yield/join/stop/destroy方法 170 新生状态 170 就绪状态 170 运行状态 170 死亡状态 170 终止线程的典型方法(重要!!!) 171 阻塞状态(sleep/yield/join方法) ...

    用LATEX 排版编程技术书籍的一些个人经验

    中写道“如果将来有时间,我把自己用LATEX 排书的经验总结一下,让读者在阅读《Word 排版艺术》的基础上,更容易地把知识应用到LATEX 排版中去。” 我自己排版了《Linux 多 线程服务端编程:使用muduo C++ 网络库》...

    java8源码-javaGuide:java面试整理

    多线程类别知识重构 Netty 总结(---正在进行中---) 数据结构总结重构(---正在进行中---) 说明 JavaGuide介绍 对于 Java 初学者来说: 本文档倾向于给你提供一个比较详细的学习路径,让你对于Java整体的知识体系有一...

    java8源码-javaGuide:【Java学习】一份涵盖大部分Java程序员所需要掌握的核心知识。https://javaguide.cn

    多线程类别知识重构 Netty 总结(---正在进行中---) 数据结构总结重构(---正在进行中---) 说明 JavaGuide介绍 对于 Java 初学者来说: 本文档倾向于给你提供一个比较详细的学习路径,让你对于Java整体的知识体系有一...

    用python写一个适合自己的装饰器库,自己动手,丰衣足食

    目录用python写一个适合自己的装饰器库一、盘点一些常见的装饰器提示信息装饰器代码:示例:检测函数进度装饰器代码:示例:计算时间装饰器代码:示例:函数多线程运行装饰器代码:示例:二、总结 一、盘点一些常见...

    编程高手箴言.rar

    7.3 多线程应用的调试 7.4 非固定错误的调试 7.4.1 激活调试环境 7.4.2 正确区分错误的类型 7.4.3 常见的偶然错误 第8章内核优化 8.1 数据类型的认识 8.2 X86优化编码准则 8.2.1 通用的X86优化技术 8.2.2 ...

    黑客反汇编揭秘(第二版).part2.rar

    18.1 初步的分析 358 18.2 解包与其他方法 361 18.3 解包算法 361 18.4 搜索原始入口点 362 18.4.1 活动程序转储 362 18.4.2 通过内存中的签名搜索启动代码 364 18.4.3 流行但低效的工具: 18.4.3 ...

    黑客反汇编揭秘(第二版).part1.rar

    18.1 初步的分析 358 18.2 解包与其他方法 361 18.3 解包算法 361 18.4 搜索原始入口点 362 18.4.1 活动程序转储 362 18.4.2 通过内存中的签名搜索启动代码 364 18.4.3 流行但低效的工具: 18.4.3 ...

    Delphi_深度编程

    本书是在总结作者多年Delphi开发经验的基础上编著而成。全书分为基础篇和应用篇。基础篇结合示例论述了Delphi的深度编程技术,其中包括9章,分别为:理解Windows消息、进程与线程、自定义组件的编写、文件操作、创建...

    编程高手箴言(推荐)

    7.3 多线程应用的调试 350 7.4 非固定错误的调试 352 7.4.1 激活调试环境 352 7.4.2 正确区分错误的类型 356 7.4.3 常见的偶然错误 357 第8章 内核优化 358 8.1 数据类型的认识 358 8.2 X86优化编码准则 359 8.2.1 ...

    《Delphi 深度编程及其项目应用开发》PDF书及代码

    2.5 进程的优先级别 2.5.1 进程的优先级类 2.5.2 相对优先级 2.6 后台多线程数据查询实例 第3章 自定义组件的编写 3.1 组件的基本概念 3.1.1 属性 3.1.2 方法 3.1.3 事件 3.1.4 拥有关系 3.1.5 父子关系 3.2 组件...

Global site tag (gtag.js) - Google Analytics