您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 线程-JAVA-教程PPt
线程线程的基本概念线程的创建和启动线程的常用方法线程的同步机制Synchronizedwait()、notify()、notifyAll()线程的概念程序、进程、线程程序:(Program)是一段静态的代码,它是应用软件执行的蓝本。进程(Process)是程序的一次执行过程,是系统运行程序的基本单位。线程(Thread)是比进程更小的执行单位。相当于一个任务中的一条执行路径。线程的概念进程与线程每个进程都有一段专用的内存区域线程可共享相同的内存单元(包括代码和数据)多进程:在操作系统中能同时运行多个任务(程序);多线程:在同一个应用程序中有多个顺序流同时执行多线程的目的是为了最大限度的利用CPU资源。Java的线程Java应用程序总是从主类的main方法开始执行。当JVM加载代码,发现main方法之后,就会启动一个线程,这个线程称作“主线程”,该线程负责执行main方法。那么,在main方法中再创建的线程,就称为主线程中的线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体,通过调用Thread类的start()方法来启动一个线程。Java的线程JVM在主线程和其他线程之间轮流切换,保证每个线程都有机会使用CPU资源,main方法即使执行完最后的语句,JVM也不会结束我们的程序,JVM一直要等到主线程中的所有线程都结束之后,才结束我们的Java应用程序。线程的生命周期新建线程在它的一个完整的生命周期内通常要经历四种状态。通过线程的控制与调度可使线程在这几种状态间转化:新建状态运行状态中断状态死亡状态线程的状态与生命周期新建状态Newborn就绪状态Runnable运行状态Running消亡状态Dead其它阻塞Blockedstart()图11.1线程的生命周期与线程的状态sleep时间到interrupt()run()结束调度时间片到yield()互斥阻塞Blocked等待阻塞Blocked获得互斥使用权sleep()join()synchronized()notify()wait()Interrupt()例8-1例8-2线程的优先级及调度管理优先级:在多线程系统中,每个线程都被赋予一个执行优先级。优先级决定了线程被CPU执行的优先顺序。线程的优先级设置遵从以下原则线程创建时,子进程继承父进程的优先级线程创建后,可通过调用setPriority()方法改变优先级。Java线程的优先级:取值范围是1~10staticintMAX_PRIORITYstaticintMIN_PRIORITYstaticintNORM_PRIORITY线程的优先级及调度管理线程的调度策略线程调度器选择优先级最高的线程运行。但是,如果发生以下情况,就会终止线程的运行。线程体中调用了yield()方法,让出了对CPU的占用权线程体中调用了sleep()方法,使线程进入睡眠状态线程由于I/O操作而受阻塞另一个更高优先级的线程出现。在支持时间片的系统中,该线程的时间片用完。线程的创建和启动Java中实现多线程的方法有两种,一种是继承java.lang包中的Thread类,二是用户在定义自己的类中实现Runnable接口。Thread类的子类来创建线程定义一个Thread的子类并重写其run方法如:classMyThreadextendsThread{publicvoidrun(){...}}生成该类的对象:MyThreadmyThread=newMyThread();Thread类的子类来创建线程classMyThread1extendsThread{publicMyThread1(Stringstr){super(str);}publicvoidrun(){........}}classCaller(){publicstaticvoidmain(String[]args){newMyThread(May1st).start();}}例题8-3用Runnable接口来创建线程定义线程类实现Runnable接口ThreadmyThread=newThread(target);//target为Runnable接口类型Runnable中有一个方法:publicvoidrun();用以定义线程运行体使用Runnable接口可以为多个线程提供共享的数据在实现Runnable接口的类的run()方法定义中可以使用Thread的静态方法publicstaticThreadcurrentThread();获取当前线程的引用用Runnable接口来创建线程classTestThread2implementsRunnable{publicvoidrun(){........}}classCaller(){publicstaticvoidmain(String[]args){MyThread2test=newMyThread2();newThread(test).start();//}}两种实现方式的区别和联系:在程序开发中只要是多线程以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:避免点继承的局限,一个类可以实现多个接口。适合于资源的共享。Runnable接口和Thread之间的联系:publicclassThreadextendsObjectimplementsRunnable例ThreadTicket.java与RunnableTicket.javaRunnable接口与目标对象使用同一目标对象的线程共享目标对象的成员变量例8-4例8-5关于run方法中的局部变量不同线程的run方法中的局部变量互不干扰,一个线程改变了自己的run方法中局部变量的值不会影响其他线程的run方法中的局部变量。例8-6线程的常用方法start()线程调用该方法将启动线程,使之从新建状态进入就绪队列排队。run()Thread类的run()方法与Runnable接口中的run()方法的功能和作用相同,都用来定义线程对象被调度之后所执行的操作,都是系统自动调用而用户程序不得引用的方法。getPriority()/setPriority()线程的常用方法sleep(intmillsecond)sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。并不释放对象锁。也就是如果有Synchronized同步块,其他线程仍然不同访问共享数据。注意该方法要捕获异常yield()与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。线程的常用方法interrupt()经常用来“吵醒”休眠的线程。getName()返回该线程的名称。setName(Stringname)改变线程名称,使之与参数name相同。isAlive()测试线程是否处于活动状态。currentThread()返回当前正在使用CPU资源的线程例题8-8线程的常用方法join()使调用该方法的线程在此之前执行完毕,也就是等待调用该方法的线程执行完毕后再往下继续执行。注意该方法也要捕获异常。在一定意义上,它可以实现同步的功能。例joinTest.java例8-13classThread下的常用函数suspend()、resume()通过suspend()函数,可使线程进入停滞状态。通过suspend()使线程进入停滞状态后,除非收到resume()消息,否则该线程不会变回可执行状态。当调用suspend()函数后,线程不会释放它的“锁标志”。例MyTest.java线程同步Synchronized由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。每个对象都有一个锁标志,当一个线程访问该对象时,被Synchronized修饰的数据将被“上锁”,阻止其他线程访问。当前线程访问完这部分数据后释放锁标志,其他线程就可以访问了。线程同步Synchronizedsynchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。publicThreadTestimplementsRunnable{publicsynchronizedvoidrun(){for(inti=0;i10;i++){System.out.println(+i);}}publicstaticvoidmain(String[]args){ThreadTestr1=newThreadTest();ThreadTestr2=newThreadTest();Threadt1=newThread(r1);Threadt2=newThread(r2);t1.start();t2.start();}}//Threadt2=newThread(r1);线程同步Synchronized每个对象只有一个锁(lock)与之相关联实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。synchronized关键字同步方法synchronized关键字同步实例方法:publicsynchronizedvoidmethod(){…}作用域:某个对象实例内,可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。注意,不同的对象实例的synchronized方法是不相干扰的。例8-9synchronized关键字同步方法synchronized关键字同步静态方法:synchronizedstaticStaticMethod{…}作用域:某个类的范围,防止多个线程同时访问这个类中的synchronizedstatic方法。它可以对类的所有对象实例起作用。注意synchronized关键字不能继承。在定义接口方法时不能使用synchronized关键字。构造方法不能使用synchronized关键字(synchronized块来进行同步)。Synchronized的位置不能放在方法返回类型的后面在非静态方法中,synchronized还可以放在方法定义的最前面,在静态方法中,synchronized可以放在static的前面注意synchronized关键字只能用来同步方法,不能用来同步类变量publicsynchronizedvoidmethod();synchronizedpublicvoidmethod();publicstaticsynchronizedvoidmethod();publicsynchronizedstaticvoidmethod();synchronizedpublicstaticvoidmethod();publicvoidsynchronizedmethod();publicstaticvoidsynchronizedmethod();publicsynchronizedintn=0;publicstaticsynchronizedintn=0;虽然使用synchronized关键字同步方法是最安全的同步方式,但大量使用synchronized关键字会造成不必要的资源消耗以及性能损失。虽然从表面上看synchronized锁定的是一个方法,但实际上synchronized锁定的是一个类。如果在非静态方法method1和method2定义时都使用了synchronized,在method1未执行完之前,method2是不能执行的。静态方法和非静态方
本文标题:线程-JAVA-教程PPt
链接地址:https://www.777doc.com/doc-6157484 .html