- 浏览: 24040 次
- 性别:
线程基础
- 博客分类:
- 总结
线程基础
一.进程和线程
这两个概念常放在一起比较,互相理解。
简单而言,一个应用程序就是一个进程,而线程就是一个进程内部的独立的运行单位。
一个进程至少有一个线程,称为主线程。
只有一个主线程的进程称为——单线程模型。
拥有多个线程,可以并行执行的进程称为——多线程模型
二.进程和线程的区别
1)
A.多个进程之间的数据是完全独立的,要实现进程之间通信必须通过网络,不论局域网或是广域网。
B.多个线程之间是共享一块内存空间和系统资源,简单讲就是数据共享,在进程之间可以相互调用。
2)
A.进程的数据存储是要分配虚拟内存的,进程之间的切换较线程要慢
B.独立的线程的数据通常只有寄存器数据,和程序执行时使用的堆栈,即是临时的,当线程结束一次操作时,数据会自动释放,线程切换的负担很小。
3)更深层次理解线程,根据电脑不同性能,能同时实现多线程的个数也不同,但基本原理是一样的。线程运行是根据获取CPU情况而定的,获得CPU就运行,多线程只不过是CPU在它们之间快速切换,我们根本觉察不出有时间差。而且,线程类中也有很多设置CPU分配规则的方法,如休眠,优先级,。。。能灵活控制线程的运行。
单线程模式中进程则会一直占用CPU资源,直到执行完任务,效率较低,且无法实现多元化。
三.Java中的多线程实现
多线程实际就是创建多个线程对象,有一样的run方法。线程的启用时通过调用start()方法启动,从run()方法开始运行,当run()方法结束后,线程即运行结束。所以,一定要重写run方法。
Java中共有3种方法实现多线程。
分别是:1)继承Thread类 2)实现Runnable接口3)内部类实现
以下分别用这三种方法实现多线程查找文件来介绍其基本用法:
1)继承Thread类
public class FindThread extends Thread { //构造函数传根目录的值 String rootDirName; //构造函数 public FindThread(String rootDirName) { this.rootDirName = rootDirName; } /** * 重写run方法 */ public void run() { CountFile cf=new CountFile(rootDirName);//根据根目录查找文件类 int fileCount = cf.countDir(rootDirName); System.out.println("------驱动器:" + this.rootDirName + "统计完毕:"+ ";共有文件数量:" + fileCount + " ;用时(单位:秒):" + timeCost / 1000); } }
//主函数中调用
for(int i=0;i<fileList.length;i++){ //创建线程对象,调用方法 FindThread ft=new FindThread(fileList[i].getAbsolutePath()); ft.start(); }
2)实现Runnable接口
public class FindRunnable implements Runnable {
String rootDirName; //构造器 public FindRunnable(String rootDirName) { this.rootDirName = rootDirName; } // 实现run方法 public void run() { long start = System.currentTimeMillis(); CountFile cf = new CountFile(rootDirName); int count=cf.countDir(rootDirName); long timeCost = System.currentTimeMillis() - start; System.out.println("------驱动器:" + this.rootDirName + "统计完毕:"+ ";共有文件数量:" + count + " ;用时(单位:秒):" + timeCost / 1000); try { // 每个线程暂停不同时间 Thread.sleep(10000); //若没有休眠,线程在循环执行中会一直占用CPU资源,甚至达到100%,若一个线程要长时间循环执行某任务,就必须让线程休眠一段时间 } catch (InterruptedException ie) { System.out.println("线程在sleep中收到中断信号,但不退出:" + ie); } } }
for(int i=0;i<fileList.length;i++){ FindRunnable fr=new FindRunnable(fileList[i].getAbsolutePath()); Thread thread=new Thread(fr);//线程Thread也是实现了Runnablede 类,要启动线程,必须创建Thread对象,调用start()方法。 thread.start(); }
3)内部类实现
for(int i=0;i<fileList.length;i++){//每个磁盘都创建一个线程
final String rootDirname=fileList[i].getAbsolutePath(); Thread thread=new Thread(){//创建线程,重写run方法 public void run(){ CountFile cf=new CountFile(rootDirname); int fileCount = cf.countDir(rootDirname); System.out.println("------驱动器:" + rootDirname + "统计完毕:" + ";共有文件数量:" + fileCount + " ;用时(单位:秒):" + timeCost / 1000); } }; thread.start();
四.扩充——继承TimeTask类实现线程的定时执行
定时执行时现实生活中常有的需求,JDK提供了2个类来实现这种功能:
1)实现java.util.TimeTask类 2)调度TimeTask对象定时运行的Timer类
实现方法是:
Public void schedule(TimeTask task,long delay,long period)
它会使程序启动 delay毫秒后,没隔period毫秒执行一次。
此上其实就是闹钟的基本原理,即当设定好时间后,程序启动两个时间差后,每隔一定时间进行提醒。
//先定义一个Timer类
private static Timer timer2;
//当事件被触发,即设定闹钟时间后
timer2 = new Timer();//创建对象
int i = Integer.parseInt(tf2.getText());//得到输入的闹铃时间
//实例化一个继承TimeTask类的对象
TimerTaskDemo ttd = new TimerTaskDemo();//定时器执行的方法,弹出提醒框或音乐等
timer2.schedule(ttd, l2 - l, i * 60 * 1000);//制定计划
线程的功能十分强大,现实生活中的大多数程序都是多线程的,例如游戏,有众多人物,武器等,形象的描述多线程就是一个独立房间里每个对象都在执行自己的方法,也就是在计算机局限的环境下用多线程模拟现实生活中场景。
下一节,将以我们小组做的坦克游戏为例子,说明我对线程的学习情况。
发表评论
-
java基础整理
2013-05-13 22:22 0Java基础整理 从武汉回来有好几周的时间了 ... -
线程同步
2013-01-18 23:49 826窗外狂风大作,实在不想在睡觉时刻本着不完成誓不罢休不 ... -
线程同步
2013-01-18 23:19 0窗外狂风大作,实在不 ... -
数据结构-----Hash
2012-11-23 10:14 868数据结构之Hash表 一.数据结构概念 数据结 ... -
通信基础小结
2012-10-29 00:14 748通信基础小结 通信 ... -
线程项目总结
2012-08-01 22:46 909线程项目——坦克大战总结 一.预计游 ... -
数据结构之链表
2012-08-01 22:23 636数据结构之链表 链表的基本概念 ... -
哈弗曼树解压缩
2012-07-30 15:06 787... -
IO总结
2012-07-16 21:05 645Java IO 总结 第一部分 ... -
Java集合机制
2012-07-15 20:01 989Java 集合框架 一.关于集合 ... -
异常机制
2012-07-11 14:30 738JAVA异常机制总结 ... -
画图板小结
2012-07-05 10:05 707项目总结——画板 一.整体思路 ... -
关键字
2012-05-25 16:28 599关键字总结 一.关键字分类 1.常用关键字 ... -
继承,转型,重写,多态性
2012-05-13 15:11 669Java实战入门小结——02 一:继承 1 ... -
类,对象,构造函数,this关键字等
2012-04-15 22:48 1120Java实战入门小结--01 一:类与对象的关系 类 ...
相关推荐
C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程基础C#多线程...
JAVA多线程基础DEMO,都是一些基础演练,希望可以帮到你
本资料为C#多线程基础知识资料合辑(基础部分)
本资源致力于向您介绍 Java 并发编程中的线程基础,涵盖了多线程编程的核心概念、线程的创建和管理,以及线程间通信的基本方法。通过深入学习,您将建立扎实的多线程编程基础,能够更好地理解和应用多线程编程。 多...
CSharp多线程基础教程,CSharp多线程基础教程
多线程从基础讲起,包括线程基础、线程属性、互斥量、共享内存、条件变量。
python 线程的使用 python线程基础知识,提供python2示例代码,供参考学习 python 提供thread和theading两个线程模块,thread较底层,threading较方便,大多数情况下使用theading就足够了; thread_test.py start(),...
MFC多线程基础解析及例子,帮助学习多线程。以后再补充
java多线程基础资料,java多线程基础资料
java 线程基础入门 一个关于计算机的简化的视图是:它有一个执行计算的处理机、包含处理机所执行的程序的ROM(只读存储器)、包含程序所要操作的数据的RAM(只读存储器)。在这个简化视图中,只能执行一个作业。一个...
C#多线程基础教程 C#多线程基础教程 C#多线程基础教程
多线程基础理论, 多线程中常用API,多线程的实现方式, 线程池以及创建线程池相关API, 常见的设计模式等内容
Java线程基础教程完整版
多线程基础代码
IBM JAVA java 多线程 教程 线程简介 从IBM弄到的java线程基础教程
C# 多线程基础练习,需要学习多线程的小伙伴们快来下载吧
C#多线程基础教程,很全面的基础知识。希望对各位有用。
java多线程基础知识
并发编程之多线程基础