版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java多线程,Java 线程模型,理解线程概念 进程的概念 线程的概念 线程与进程的区别和联系 一个进程在其执行过程中,可以产生多个线程。 在进程概念中,每一个进程的内部数据和状态都是完全独立的。但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈,线程是比进程更小的执行单位,是进程内部独立的,有序的指令流。由此,一个进程能包含多个并发执行的线程。线程是一种能够独立运行的子任务。 多线程是一种允许在程序中并发执行彼此间互相独立的多个线程机制。 多个线程的执行是并发的。 多个线程之间的代码是乱序执行的,由
2、此线程调度,同步等问题需要进行特殊处理,1. 线程的生命周期,线程的5种状态及转换方法,1. 新生状态 当利用new运算符创建线程对象实例后,它仅仅作为一个对象实例存在,JVM没有为其分配CPU时间片等线程运行资源,该线程处于新生状态。 2. 可运行状态 在处于新生状态的线程中调用start()方法将线程的状态转换为可运行状态。这时,线程已经得到除CPU时间之外的其它系统资源,只等JVM的线程调度管理器按照线程的优先级对该线程进行调度,从而使该线程拥有能够获得CPU时间片的机会。 3. 运行状态 JVM的线程调度管理器选中一个可运行状态线程,使其占有CPU并转换为运行状态。运行状态的线程执行自
3、己的run()方法中的代码,直到调用其他方法而终止、或等待某资源而阻塞或完成任务而死亡,4. 睡眠状态 处于运行状态的线程在某些情况下,如执行了sleep()方法,或等待I/O设备等资源,将让出CPU并暂时终止自己的运行,进入阻塞状态,也称为不可运行状态。 处于阻塞状态的线程是不可执行的,即使CPU空闲,也不能执行。只有当引起阻塞的原因被消除时,线程转入可运行状态,重新进入线程队列中排队等待运行,再次运行时从原来终止处继续运行。 5. 死亡状态 死亡状态是线程生命周期中的最后一个阶段。导致线程死亡的有2种情况:一是正常运行的线程完成了它的全部工作,这个任务完成的动作是由run()方法实现的;另
4、一个是线程被强制性地终止,如通过执行stop()方法来终止一个线程。 可以用isAlive()方法测试线程是否已启动。如果isAlive()方法返回false,表示该线程是新创建或已被终止;如果返回true,表示该线程已启动且未被终止,是可运行状态、运行状态或阻塞状态之一,但不能作进一步的分辨,2. 线程控制,1) start()方法 start()方法对应于启动操作 (2) stop()方法 stop()方法终止在任何状态的线程,使之转入到死亡状态 (3) sleep()方法 sleep()方法使线程暂停运行一段固定的时间。在休眠时间内,由于线程不能得到CPU 时间而不运行,指定的时间一过,
5、线程重新进入可运行状态。 public static void sleep(longmillis) throws InterruptedException public static void sleep(longmillis, intnanos) throws InterruptedException (4) yield()方法 yield()方法使得线程放弃当前分得的CPU时间,但是不使线程阻塞,即线程仍处于可运行状态,随时可能再次分得CPU时间,5) wait()方法 wait()方法使得当前线程进入阻塞状态,直到被唤醒或等够了timeout指定的时间。注意:wait()等价于wait(
6、0),它使得线程永远等待直到被唤醒为止。 public final void wait(longtimeout) throws InterruptedException public final void wait(longtimeout, intnanos) throws InterruptedException public final void wait() throws InterruptedException (6) notify()方法和notifyAll()方法 notify()方法和notifyAll()方法对应于唤醒操作。 (7) suspend()方法和resume()方法
7、 suspend()方法和resume()方法配套使用,suspend()方法使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume()方法被调用,才能使得线程重新进入可执行状态,8) interrupt()方法和interrupted()方法 interrupt()方法为线程设置一个中断标记,以便于run()方法运行时使用isInterrupted()方法能够检测到,此时,线程在sleep()之类的方法中被阻塞时,由sleep()方法抛出一个InterruptedException异常,然后捕获这个异常以处理超时。 (9) isAlive()方法 isAlive()方法用来判断一个
8、线程的run()方法是否还在执行,如果是在运行,则返回true,否则返回false,3. 线程的创建,在Java中创建线程的方法有2种:一是通过创建Thread类的子类来实现,二是通过实现Runnable接口的类来实现。 用继承Thread类的子类或通过实现Runnable接口的类来创建线程无本质的区别。但是由于Java语言不允许多重继承,所以,如果类已经继承了别的类,这样它就不能再继承Thread了。这时,就要用Runnable接口的方式,1)Thread类与Runnable接口,Thread类用于创建和控制线程。一个线程必须从run()方法开始执行,而run()方法声明在java.lang
9、.Runnable接口中。 Runnable接口中只声明了一个run()方法。任何实现Runnable接口的对象都可以作为一个线程的目标对象。 一个线程对象必须实现run()方法来完成线程的所有活动,已实现的run()方法称为该对象的线程体,Thread类在java.lang包中定义,Thread类的构造方法如下: (1) Thread () (2) Thread (Runnabletarget) (3) Thread (Runnabletarget, Stringname) (4) Thread (Stringname) (5) Thread (ThreadGroupgroup, Runna
10、bletarget) (6) Thread (ThreadGroupgroup, Runnabletarget, Stringname) (7) Thread (ThreadGroupgroup, Stringname) 任何实现Runable接口的对象对可以作为Thread类构造方法中的target参数,而Thread类本身也实现了Runable接口。因此,可以有2种方式提供run()方法来实现多线程,2)继承Thread类实现多线程,Thread类是一个具体的类,即不是抽象类,该类封装了线程的行为。要创建一个线程: Thread类包含了线程运行所需要的方法,当一个类继承了Thread类后就
11、可以在重写父类中的run()方法来执行指定的操作。 需要注意的是线程子类的对象需要通过调用自己的start()方法让线程执行,start()方法会自动调用run()方法。,例 通过继承Thread实现多线程,public class SimpleThread extends Thread int count= 1, number; public SimpleThread(int num) number = num; System.out.println(创建线程 + number); public void run() while(true) System.out.println(线程 + n
12、umber + :计数 + count); if(+count= 4) return; public static void main(String args) for(int i = 0; i 3; i+) new SimpleThread(i+1).start();,3)通过Runnable接口实现多线程,用Runnable接口创建线程 实现线程的另外一种方法是通过使用Thread类的一个构造方法public Thread(Runnable target)来创建一个新的线程 ,其中创建参数target的类负责实现Runnable接口。 Runnable接口中只有一个run( )方法,实现该
13、接口的类必须实现接口中的run( )方法,在其中定义具体操作,然后将实现了Runnable接口的类的对象作为参数创建一个Thread类的对象,调用该Thread类对象的start( )方法启动线程,例 通过实现Runnable接口实现多线程,public class Runnable1 implements Runnable int k=0; public Runnable1(int k) this.k = k; public void run() int i = k; while (i50) System.out.print(i+ ); i+=2; public static void ma
14、in (String args) Runnable1 r1 = new Runnable1(1); /创建具有线程体的目标对象 Runnable1 r2 = new Runnable1(2); Thread t1=new Thread(r1); /以目标对象创建线程 Thread t2=new Thread(r2); t1.start(); t2.start(); for (int i=0;i40;i+) System.out.print(A );,两种线程实现方式的对比分析 通过继承Thread类来实现多线程的编程这种方法简单明了,但是它也有一个很大的缺点,那就是如果相应的多线程处理类已经继
15、承了一个类,便无法再继承Thread这个类,所以我们一般情况下采用Runnable接口的方法来实现多线程的编程。使用Runnable接口的来实现多线程在开发过程中能够在一个类中包容所有的代码,以便封装。但是使用Runnable接口的方法的缺点在于如果想创建多个线程并使各个线程执行不同的的代码,就必须创建额外的类,这样的话在某些情况下不如直接用多个类分别继承Thread紧凑,18,线程的优先级,线程的优先级用数字来表示,范围从1到10,即Thread.MIN_PRIORITY到Thread.MAX_PRIORITY。一个线程的缺省优先级是5,即Thread.NORM_PRIORITY。 int
16、getPriority(); void setPriority(int newPriority,19,class ThreadTest public static void main( String args ) Thread t1 = new MyThread(T1); t1.setPriority( Thread.MIN_PRIORITY ); t1.start( ); Thread t2 = new MyThread(T2); t2.setPriority( Thread.MAX_PRIORITY ); t2.start( ); Thread t3 = new MyThread(T3); t3.setPriority( Thread.MAX_PRIORITY ); t3.start( );,20,class MyThread extends Thread String message; MyThread ( String m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年贵州省凯里市高一化学上册期末考试模拟试卷(有一套)附答案
- 2026年云南省瑞丽市高三生物下册期末考试模拟测试卷带答案
- 2026年广东省四会市高一化学上册期末考试真题附完整答案(网校专用)
- 2026年河南省巩义市高三生物上册期末考试考试卷及参考答案
- 2026年山东省海阳市高一化学上册期末考试测试卷及完整答案(名师系列)
- 2026年山东省邹城市高三生物上册期末考试模拟测试卷带答案
- 2026年河北省泊头市高三生物下册期末考试模拟考试卷及答案
- 六年级数学下册 第2课时 比例的意义
- 基于杭州西湖的公共休闲旅游资源使用者拥挤感知与优化策略探究
- 基于机器学习的报销审批与期末余额预测模型构建及应用研究
- 强制性产品认证检查员考试考题模拟题及答案
- EPC总承包工程竣工验收报告
- 人教版英语九年级上册Unit4单词讲解课件
- 国家卫健委公立医院绩效考核指标体系2026版操作手册
- 酒店人员绩效考核管理办法
- 尚德守法 共享食安主题班会
- 中考命题人才库模拟考试试题及答案
- 26年老年记录举证规范培训课件
- 2026年功能教室使用与管理制度
- 护理礼仪与人文关怀
- 福建福建省2025年大学生乡村医生专项招聘61人笔试历年参考题库附带答案详解(5卷)
评论
0/150
提交评论