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

java多线程1:概念与原理

2012-10-27 
java多线程一:概念与原理1、线程是什么???? 几乎所有的操作系统都支持同事运行多个任务,一个任务通常就是一

java多线程一:概念与原理

1、线程是什么?

??? 几乎所有的操作系统都支持同事运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程。

??? 多线程则扩展了多进程的概念。使得同一个进程可以同时并发处理多个任务。线程(Thread)也被成为轻量级的进程(lightweight process),线程是进程的执行单元。就想进程在操作系统中的地位一样,线程是程序中独立的并发的执行流。当程序被处理化后,主线程就被创建了。对于大多数应用程序来说,通常都会有一条主线程,但我们也可以在该进程中创建多条执行流,这些顺序执行流就是线程,每条线程都是相互独立的。

???? 线程是独立运行的,它不知道进程中是否还有其它线程存在。线程的执行是抢占式的,也就是说,当前运行的线程在任何时候都有可能被挂起,以便另外一个线程可以运行。

???? 简而言之:一个程序运行后至少有一个进程,而一个进程可以包含多个线程,但至少有一个线程。

2、线程的创建和使用

???? Java中使用Thread类来代表线程, 所有的线程对象都必须是Thread类或其子类的实例。每条线程的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序执行的代码)。Java使用run方法来封装这样一段程序流。

(1)、通过继承Thread类,并重写run方法来创建线程类,该run方法体就是代表了线程要完成的任务。所以我们把run方法称为线程体。

package com.yt.manager.thread;/** * @Description: 通过继承Thread来创建线程类 * @ClassName: FirstThread * @Project: base-info * @Author: zxf * @Date: 2011-7-12 */public class FirstThread extends Thread {// 重写run方法,run方法的方法体就是线程的执行体@Overridepublic void run() {for (int i = 0; i < 100; i++) {// 通过getName()方法来返回当前线程名System.out.println(this.getName() + "  " + i);}}public static void main(String[] args) {for (int i = 0; i < 100; i++) {// 也可以使用Thread.currentThread().getName()来获取当前的线程名System.out.println(Thread.currentThread().getName() + "  " + i);if (i == 20) {new FirstThread().run();new FirstThread().run();}}}}/** * 上面的程序显式的创建了两个子线程,但实际上程序至少有三个线程,程序显式的创建的两条子线程和主线程(main方法就代表线程的执行主题)。 *  */

?(2)、实现Runnable接口来创建线程类,并实现该接口中的run方法,该run方法同样是该线程的执行体。

package com.yt.manager.thread;/** * @Description:通过实现Runnable接口,并重写run()方法来创建线程类 * @ClassName: SecondThread * @Project: base-info * @Author: zxf * @Date: 2011-7-12 */public class SecondThread implements Runnable {@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName() + "  " + i);}}public static void main(String[] args) {for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName() + "  " + i);if (i == 20) {SecondThread st = new SecondThread();new Thread(st, "thread_1").start();new Thread(st, "thread_2").start();}}}}

?

以上两种方式的对比:

(1)、采用继承Thread类方式的多线程:

????? 劣势是:因为线程已经继承了Thread类,所以不能再继承其他类。

????? 优势是:编写简单,如果需要访问当前的线程,无效使用Thread.currentThread()方法,直接使用this即可以获取当前线程的实例。

(2)、才用实现Runnable接口方式的多线程。

????? 优势是:线程实现了Runnable接口,还可以继承其他类。在这种方式下,一个多线程可以共享一个target对象,所以非常适合多个线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,更好的面向对象。

????? 劣势是:变成较为复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法来获取。


3、线程的生命周期:

?????? 当线程被创建后,它既不是已启动就进入执行状态,也不会一直处于执行状态,在线程的生命周期中。它要经过新建(new)、就绪(Runnable)、运行(run)、阻塞(Blocked)、死亡(Dead)五种状态。尤其是线程在启动以后,它不会之一霸占这CPU独自运行,所以CPU要在多条线程之间切换,所以线程状态也会在运行、阻塞之间切换。

java多线程1:概念与原理

(1)、当程序通过new关键字创建了一个线程后,该线程就处于新建状态。此时他和其他Java对象一样,仅仅由JVM为其分配了内存,初始化了成员变量的值。此时的线程没有执行start()方法,所以程序不会执行线程体中的线程执行体。

(2)、当线程对象调用了start()方法之后,该线程就处于就绪状态,但是此时线程调度器还没有把该线程设置为当前线程,此时处于就绪状态。当一个线程从等待或者睡眠状态回来之后, 也会处于就绪状态。

(3)、线程调度器把处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run()方法中的代码。

(4)、线程在运行的时候被暂停,通常是为了等待某个时间的发生之后再继续运行。sleep、suspend、wait等方法都可以导致线程阻塞。

(5)、线程会以以下三种方式之一结束,结束后就处于死亡状态。

????????1、run方法执行完成,线程正常结束。

??????? 2、线程抛出一个未捕获的Exception或Error。

??????? 3、直接调用线程的stop方法来结束该线程,该方法容易造成死锁,通常不推荐使用。

热点排行