首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

十.多线程

2013-11-22 
10.多线程?10、多线程10.1、 进程与线程进程: 简单地说,在多任务系统中,每个独立执行的程序称为进程,也就是“

10.多线程

?

10、多线程10.1、 进程与线程

进程: 简单地说,在多任务系统中,每个独立执行的程序称为进程,也就是“正在进行的程序”。

线程: 一个进程中又可以包含一个或多个线程,一个线程就是一个程序内部的一条执行线索。

?

10.2、java生命周期:

①新建状态:即创建一个新的线程对象(new Thread)。当一个线程处于创建状态时,系统不为它分配资源。?

Thread myThread=new Thread( ); ? ? ? ? ?

②就绪状态:Java通过start方法启动处于新建状态的线程对象,使其进入就绪状态。处于就绪状态的线程已经具备了运行条件,将进入线程队列等待系统为其分配CPU,一旦获得了CPU,线程就进入运行状态,并调用自己的run方法。?

myThread. start(); ? ? ? ? ??

③运行状态:处于就绪状态的线程被调度并获得CPU资源后即进运行状态,每一个Thread类及其子类的对象都有一个run()方法,当线程对象被调度执行的时候,它将自动调用本对象的run()方法。?

注意:线程的操作应该写到run()方法中。?

④阻塞状态:一个正在执行的线程如果在某些特殊情况下,如被人为挂起或它的CPU时间片耗尽时,将让出CPU并暂时中止自己的执行,进入阻塞状态。

阻塞时它不能进入排列队列,只有当引起阻塞的原因被消除时,线程才可以转入就绪状态,重新进到线程队列中排队等待CPU资源,以便从原来终止处开始继续执行。 ? ? ? ? ? ? ??

⑤终止状态: 终止状态是线程生命周期的最后一个阶段。线程完成全部工作后会正常结束运行,或线程被强制性的终止。

?

运行状态示意图:

?


十.多线程

?

10.3、创建线程的两种方法

(1)、用Thread创建:

?

public class ThreadDemo1{public static void main(String args[]){new TestThread().start();while(true){System.out.println("main thread is running");}}}class TestThread extends Thread{public void run(){while(true){System.out.println(Thread.currentThread().getName() + " is running");}}} 

?小结:

?

1. 要将一段代码在一个新的线程上运行,该代码应该在一个类的run函数中,并且run函数所在的类是Thread类的子? ??类。倒过来看,我们要实现多线程,必须编写一个继承了Thread类的子类,子类要覆盖Thread类中的run函数,? ?在子类的run函数中调用想在新线程上运行的程序代码。

2. 启动一个新的线程,我们不是直接调用Thread的子类对象的run方法,而是调用Thread子类对象的start(从? ? ? ? ? ? ??Thread类中继承的)方法,Thread类对象的start方法将产生一个新的线程,并在该线程上运行该Thread类对? ??象中的run方法,根据面向对象的多态性,在该线程上实际运行的是Thread子类(也就是我们编写的那个类)对? ??象中的run方法。

3. 由于线程的代码段在run方法中,那么该方法执行完成以后线程也就相应的结束了,因而我们可以通过控制run方? ??法中的循环条件来控制线程的终止。

?

(2)、用Runnable接口创建多线程

public class ThreadDemo3{public static void main(String args[]){//new TestThread ().start();TestThread tt= new TestThread();//创建TestThread类的一个实例Thread t= new Thread(tt);//创建一个Thread类的实例t.start();//使线程进入Runnable状态while(true){System.out.println("main thread is running");}}}class TestThread implements Runnable {  //extends Threadpublic void run(){  //线程的代码段,当执行start()时,线程从此出开始执行while(true){System.out.println(Thread.currentThread().getName() + " is running");}}}
?10.4 、两种方法的比较

实现Runnable 接口相对于继承Thread类来说,有如下显著的好处:

1、适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码、数据有效分离,较好? ? ?地体现了面向对象的设计思想。

2、可以避免由于Java的单继承特性带来的局限。我们经常碰到这样一种情况,即当我们要将已经继承了某一个类的? ? ?子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么,这个类就只能采? ? ?用实现Runnable接口的方式了。

3、有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的? ? ?实例时,即称它们共享相同的代码。

? ? ?多个线程可以操作相同的数据,与它们的代码无关。当共享访问相同的对象时,即它们共享相同的数据。

? ? ?当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了? ? ? ? ? ??? ? ?Runnable接口的类的实例。

?

热点排行