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

Java学习笔记(五、多线程)

2008-10-23 15:57 441 查看
8.1线程的基本概念
程序是一段代码,是静态的。
进程是程序的一次执行过程,是动态的,从代码加载、执行,直到完成的一个完整过程。
线程是一个控制流,也是一个执行过程,但执行单位比进程小。一个进程在其执行过程中可以产生多个线程。
线程和进程的比较,它们的共同点是,都是程序的一个执行过程。不同点是 进程是一个实体,每个进程都有自己的状态、专用数据段;同一个进程下的线程则共享进程的数据段。创建进程时,必须建立其专用数据段;创建线程时不必建立新的数据段。线程不能是独立运行的程序,而只是某个进程内的一个执行流。
线程的建立和线程间的切换速度大大超过进程,不需要数据段的保护和恢复。同时,又具备进程的大多数优点。缺点是由于多个线程共享数据段,带来数据访问过程中的互斥和同步问题。
8.1.1线程的生命周期
一个线程“创建->工作->死亡”的过程称为线程的生命周期。共有5个状态:新建状态、就绪状态、运行状态。阻塞状态和死亡状态。
1、新建状态
指创建一个线程,但是它还没有启动。处于新建状态的线程对象,只能被启动或终止。Thread mythread=new Thread();
2、就绪状态
是当线程处于新建状态后,调用了start()方法后。就绪状态线程具备了运行条件,但尚未进入运行状态。
3、运行状态
是某个就绪状态的线程获得cpu资源,正在运行。如果有更高优先级的线程进入就绪状态,则该线程将被迫放弃对cpu的控制权,进入就绪状态。使用yield()方法可以是线程主动放弃cpu。线程也可能由于执行结束或执行stop方法进入死亡状态。每个线程对象都有一个run()方法,当线程对象开始执行时,系统就调用该对象的run方法。
4、阻塞状态
是正在运行的线程遇到某个特殊情况。例如,延迟,挂起等。进入阻塞状态的线程让出cpu,并暂时停止自己的执行。线程进入阻塞状态后,就一直等待,直到引起阻塞的原因被消除,线程就又转入就绪状态。
线程从阻塞状态恢复到就绪状态,有三种途径:自动恢复;调用resume方法恢复,用notify或notifyAll方法通知恢复。也可能因为别的线程强制某个处于阻塞状态的线程终止,该线程就从阻塞状态进入死亡状态。
5、死亡状态
是指线程不再具有继续运行的能力,也不能再转到其他状态。一般有两种情况使一个线程终止,进入死亡状态。一是线程完成了全部工作。一是线程被提前强制性终止。
8.1.2线程调度与优先级
java提供一个线程调度器来监视和控制就绪状态的线程。线程的调度策略采用抢占式,优先级高的线程比优先级低的线程优先执行。在优先级相同的情况下,就按先到先服务的原则。
每个java程序都有一个默认的主线程,就是通过jvm启动的第一个线程。对于应用程序,主线程执行的就是main()方法。对于Applet,主线程指浏览器加载并执行小应用程序的那个线程。子线程是由应用程序创建的线程。另有一种线程成为守护线程,是一种用于监视其他线程工作的服务线程,它的优先级最低。
8.2 Thread类和Runnable接口
java程序实现多线程应用有2种途径:一是继承Thread类,用Thread子类创建线程对象。二是在类中实现Runnable接口,在类中提供Runnable接口的run方法。程序员能控制的关键性工作有两个方面:一是编写线程的run方法;二是建立线程实例。
8.2.1 用Thread子类实现多线程
先声明一个Thread类的子类,并在子类中重新定义run方法。当程序需要建立线程时,就可创建Thread子类的实例,并让创建的线程调用start方法,这时,run方法将自动执行。
8.2.2 Runnable 接口
只有run方法需要实现。一个实现Runnable接口的类实际上定义了一个在主线程之外的新线程的操作。
8.3 线程互斥和同步
8.3.1线程互斥
假设有若干线程共享某个变量,且都对变量有修改。如果它们之间不考虑相互协调工作,就会产生混乱。
解决多线程互斥的方法是,某个线程在使用共享变量时,别的线程暂时等待,等待正在使用共享变量的线程使用结束。等到前一个线程使用结束后,才能让等待使用该变量的线程中的某一个使用它,而别的线程继续等待。
在java语言中,使用关键字synchronized定义临界段,能对共享对象的操作上锁。
8.3.2 线程同步
例如,当线程A使用到某个对象,而此对象又需要线程B修改后才能符合本线程的需要,这时线程A就要等待线程B完成修改工作。这种线程相互等待成为线程的同步。
为了实现同步,java语言提供了wait(),notify(),notifyAll()供线程在临界段中使用。在临界段中使用wait方法,使执行该方法的线程等待,并允许其他线程使用这个临界段。当线程使用完临街段后,用notify方法通知由于想使用这个临界段而处于等待的线程结束等待。notify方法只是通知第一个处于等待的线程。如果某个线程在使用完临界段后,其他早先等待的线程都可结束等待,重新竞争cpu,这时可以使用notifyAll方法。
有三种类型的代码能够作为临界段:类方法,实例方法,一个方法中的代码块。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: