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

java线程的学习

2011-09-18 10:35 10 查看
上个礼拜在工作中(Java Web开发),对一个耗时较久的工具类进行了改造,让其支持多线程。同时客户端每隔一段时间发送一次ajax请求,用于获取工具类的处理进度信息,下面工作中的一些总结,其中进程和线程部分还有待进一步学习,总结如下:
1.进程
1.1进程的概念
翻阅操作系统原理的定义:进程是一个可并发执行的具有独立功能的程序关于某个数据集合的一次执行过程,也是操作系统进行资源分配和调度的基本单位。
进程是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处理器并由处理器执行的一个实体;由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元。比如说Windows中的exe文件,当运行exe文件的时候,系统就会分配cpu和内存等资源,为该可执行的exe文件开辟一个新的进程,也就是说只有当程序执行之后系统才会为其开辟进程,程序没有执行的时候,只是一个存放在磁盘中的可执行文件。
1.2进程的状态和转换
一个进程从创建而产生至撤销而消亡的整个生命期间,有时占有处理器执行,
时虽可运行但分不到处理器、有时虽有空闲处理器但因等待某个事件的发生而无法执行,这一切都说明进程和程序不相同,它是活动的且有状态变化的。
(1)三态模型转换
一般来说,按进程在执行过程中的不同情况至少要定义三种不同的进程状态:
运行(running)状态:进程占有处理器正在运行。
就绪(ready)状态:进程具备运行条件,等待系统分配处理器以便运行。
阻塞状态:又称为阻塞(blocked)态或睡眠(sleep)态,指进程不具备运行条件,正在等待某个事件的完成。
进程的转化图:





进程三态模型及转换

(2)五态模型转换图
新建态:创建一个进程一般分为两步:首先,为一个新进程创建PCB(进程控制块),并填写必要的管理信息;其次,把该进程转入就绪状态并插入就绪队列中
终止态:终止一个进程也分成两步:首先操作系统对其进行善后处理,然后将PCB清空。
ps:PCB概念。
PCB是为了描述和控制进程的运行,系统为每个进程定义了一个数据结构--进程控制块PCB(processcontrolblock),它是进程实体(程序段、相关的数据段和PCB)的一部分,是操作系统中最重要的记录型数据结构。PCB中记录了操作系统所需的、用于描述进程的当前情况以及控制进程运行的全部信息。



进程五态模型及转换
(3)具有挂起功能系统的进程状态及其转换
由于进程的不断创建,系统的资源特别如内存资源已经不能满足进程运行的要求;或者由于系统故障等原因,需要挂起一些进程;或者由于其他的种种原因,必须把某些进程挂起(suspend),对换到磁盘镜像区中,释放它所占有的某些资源,暂时不参与低级调度,起到平滑系统操作负荷的目的。



具有挂起功能系统的进程及转换
2线程
2.1线程和进程的关系
进程是系统进行资源分配的基本单位,按进程为单位分给存放其映象所需要的虚地址空间、执行所需要的主存空间、完成任务需要的其他各类外围设备资源和文件。同时,进程也是处理器调度的基本单位。
而线程具有许多传统进程所具有的特征,所以又成为轻量级集成或者进程元,可以把线程作为调度和分配。在一个进程中,通常拥有一个或者多个线程,这多个线程线程不拥有资源,而是共享进程的资源。用一句话总结就是:在一个进程中,进程是作为资源拥有的基本单位,而线程是作为调度和分派的基本单位,多个线程共享这个进程的资源。
2.2线程的作用
提高系统内程序并发执行的速度,从而进一步提高系统的吞吐量。引入线程之后可以减少程序在并发执行时所付出的时空开销,使系统具有更好的并发性。
3 java中的线程
3.1 java中创建线程的两种方法
java中创建线程的两种方法:第一种是实现Runnable接口,第二种是继承Thread类,下面分别对这两种方式进行阐述:
(1)实现Runnable接口(推荐使用这种方法)
我们还是来看一个具体的例子吧,

public class Test implements Runnable{
	/**如何启动线程*/
    public static void main(String[] args) {
    	Test test = new Test();
    	Thread t = new Thread(test); //实例化一个线程对象的方法,使用start方法
    	t.start();//调用线程的start方法,表示启动线程;线程启动后,自动会调用Test类的run方法
    }
    
    /**实现Runnable接口的run方法*/
	public void run() {
		//在run方法里面要做的事情、要处理的任务
		//...
	}
}

(2)继承Thread类

public class Test extends Thread{
	/**如何启动线程*/
    public static void main(String[] args) {
    	Test test = new Test();
    	Thread t = new Thread(test); //实例化一个线程对象,使用start方法
    	t.start();//调用线程的start方法,表示启动线程;线程启动后,自动会调用Test类的run方法
    }
    
    /**实现Runnable接口的run方法*/
	public void run() {
		//在run方法里面要做的事情、要处理的任务
		//...
	}
}
需要注意的是,继承Thread类必须重写Thread类的run方法。

其他
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: