- ------- <a target="blank">android培训</a>、<a target="blank">java培训</a>、期待与您交流! ----------
复制代码
线程的概念
程序、进程与线程:
程序:一段静态的代码,它是应用软件执行的蓝本。
进程:程序的一次动态执行过程(动态概念),它对应了从代码加载、执行到执行完毕的完整过程。一个程序可以被多次加载到系统的不同区域分别执行,形成不同的进程。
线程:比进程更小的执行单位(动态概念)。一个进程在执行过程中可产生多个线程,形成多条执行线索。每个进程都有一段专用的内存区,并以PCB(Process Control Block)作为它存在的标志;而一个进程中的所有线程可以共享该进程的同一个地址空间和操作系统资源,并利用这些共享单元实现数据交换、实时通信与必要的同步操作。因此多线程占用系统资源少、线程间通信快。 一、.线程的状态及其转换 1.线程的状态: 创建,阻塞,运行,就绪,死亡 2 创建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象属于新建状态。 Thread myThread=new MyThreadClass();
3 就绪:处于创建状态的线程被启动后将进入线程队列等待CPU时间片,此时它已具备了运行条件,一旦被分配了CPU就可脱离创建它的主线程独立开始其生命周期,另外处于阻塞状态的线程被解除阻塞后以及处于运行态的线程时间片到后也将进入就绪态。
4 运行:就绪态的线程被调度并获得CPU时进入运行态,并自动执行run()方法。
5 阻塞:正在执行的线程若被人为挂起或系统原因必须停止运行将进入阻塞状态。如:该线程正等待I/O操作,调用该线程的sleep()方法、wait()方法、suspend()方法等。
6 死亡:正常终止,就是正常运行run()方法后终止;异常终止,如调用stop()方法或destroy()方法终止线程。 二、多线程实现的两种方法 继承Thread类、实现Runnable接口(此方法比较灵活,因为实现Runnable接口的类还可以继承其他类)。
1 继承Thread类
通过定义java.lang包中的Thread类的子类并在子类中重写run()方法。由于java不能多重继承,此方法简单但不灵活。Thread类的构造函数及主要方法如下:
public Thread():产生一个名字自动生成的线程,名字形式为Thread_1、Thread_2、、、;
public Thread(Runnable target):生成一个指定目标对象的线程;
public Thread(String name):生成一个指定名字的线程;
public Thread(ThreadGroup group,Runnable target):生成一个指定线程组和目标对象的线程;
public Thread(ThreadGroup group,String name):生成一个指定线程组和名字的线程。
通过继承Thread类实现多线程示例:ThreadTest.java程序中subThread类继承了Thread类,先定义了一个构造函数调用父类的构造函数给该线程置名,然后重写了run()方法,使线程运行时每输出一个循环变量后休眠一段随机时间,让另一个线程运行,一个线程的run()方法结束前输出该线程的结束信息。
2 实现Runnable接口
Runnable接口只有一个run()方法,要实现此接口就必须定义run()方法的具体内容,方法体内可定义用户要做的操作。然后以这个实现了Runnable接口的类为参数创建Thread类的对象,也就是用Runnable接口的目标对象初始化Thread类的对象,如此就可把用户实现的run()方法继承过来。 |