码迷,mamicode.com
首页 > 编程语言 > 详细

关于Java中进程和线程的详解

时间:2017-01-07 19:22:22      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:进程和线程   strong   cpu   call   ges   转换   创建线程   放弃   进程控制   

一.进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命

          周期。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消。反映了一个程序在

         一定的数据 集上运行的全部动态过程。通过进程控制块(PCB)唯一的标识某个进程。同时进程占据着相应的资源(例如包

         括cpu的使用 ,轮转时间以及一些其它设备的权限)。是系统进行资源分配和调度的一个独立单位。

           程序和进程之间的主要区别在于:

                       状态         是否具有资源       是否有唯一标识      是否具有并发性

            进程     动态                有                      有                     有

            程序     静态                无                      无                     无     

         进程的基本状态:

       1、就绪(Ready)状态

       当进程已分配到除CPU以外的所有必要资源后,只要在获得CPU,便可立即执行,进程这时的状态就称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将他们排成一个队列,称为就绪队列。

       2、执行状态

       进程已获得CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态;再多处理机系统中,则有多个进程处于执行状态。

       3、阻塞状态

       正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态,亦即程序的执行受到阻塞,把这种暂停状态称为阻塞状态,有时也称为等待状态或封锁状态。

三种进程之间的转换图:

   线程: 可以理解为进程的多条执行线索,每条线索又对应着各自独立的生命周期。线程是进程的一个实体,是CPU调度和分派的

            基本单位,它是比进程更小的能独立运行的基本单位。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之

            间可以并发执行。

            这里在详细讲解一下Java中的进程和线程的概念。

            Java中的线程要经历4个过程

            1)创建

                  创建一个Java线程常见的有两种方式:

                  继承Thread类和实现Runnable接口这两种方式。

            2)执行

                      线程创建后仅仅占有了内存资源,在JVM管理的线程中还没有该线程,该线程必须调用start方法通知JVM,这样JVM

                 就会知道又有一个新的线程排队等候了。如果当前线程轮到了CPU的使用权限的话,当前线程就会继续执行。

           3)中断

                a.JVM将CPU的使用权限从当前线程切换到其它线程,使本线程让出CPU的使用权限而处于中断状态。

                b.线程在执行过程中调用了sleep方法,使当前线程处于休眠状态。

                c.线程在执行的过程中调用wait方法

                d.线程在使用cpu资源期间,执行了某个操作而进如阻塞状态。

           4)死亡

               死亡的线程不在具有执行能力。线程死亡的原因有二:

                a.线程正常运行结束而引起的死亡,即run方法执行完毕。

                b.线程被提前强制终止。

 

二:线程的创建及使用

java使用Thread类代表线程,所有的线程对象都必须是Thread或者其子类的实例,每个线程的作用是完成一定任务,实际上是就是执行一段程序流(一段顺序执行的代码)

方案一:继承Thread类创建线程类

步骤:1.定义Thread类的子类 并重写该类的Run方法,该run方法的方法体就代表了该线程需要完成的任务

      2.创建Thread类的实例,即创建了线程对象

      3.调用线程的start方法来启动线程

 技术分享

技术分享

结论:使用继承子Thread类的子类来创建线程类时,多个线程无法共享线程类的实例变量(比如上面的i)

方案二:实现Runnable接口

1:定义Runnable接口的实现类,并重写它的Run方法,run方法同样是该线程的执行体

2:创建Runnable实现类的实例,并将此实例作为Thread的target创建一个Thread对象,该Thread对象才是真正的线程对象

3:调用start方法启动该线程

技术分享

技术分享

结论:采用Ruunable接口的方式创建多个线程可以共享线程类的实例变量,这是因为在这种方式下,程序创建的Runnable对象只是线程的target,而多个线程可以共享一个target,所以多个线程可以共享一个实例变量

 

通过Runnable实现多线程其实就是将run包装成线程的执行体,但是目前java无法将任意方法包装成线程执行体

方案三:使用callable和future创建线程

 

Java5开始,Java提供 Callable接口,Callable接口提供了一个call()方法可以作为线程执行体,看起来和Runnable很像,但call()方法更强大——call()方法可以有返回值、call()方法可以抛出异常

 

Java5提供了Future接口来代表Callable接口的call()方法的返回值,并Future接口提供了一个FutureTask实现类,该实现类实现类Future接口,也实现了Runnable接口——可以作为Thread的target。

实现步骤:

1:创建Callable接口的实现类,并实现call方法,call方法会成为线程执行体,且call方法具有返回值,在创建callable接口的实现类!

2:使用FutrueTask类来包装Callable对象,FutrueTask封装类Callable的call方法的返回值

3:使用FutrueTask对象作为Thread的target创建并启动新线程

4:使用FutrueTask的get方法获取执行结束后的返回值

 技术分享

技术分享

结论:采取Runnable、Callable的优势在于——线程类只是实现了Runnable或Callable接口,还可以继承其它类;在这种方法下,多个线程可以共享一个target对象,因此非常适合多个相同线程处理同一份资源的情况,从而将CPU、代码和数据分开,形参清晰的模型,体现了面对对象的编程思想。劣势在于编程复杂度略高。

 

关于Java中进程和线程的详解

标签:进程和线程   strong   cpu   call   ges   转换   创建线程   放弃   进程控制   

原文地址:http://www.cnblogs.com/yangronglin/p/6260107.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!