欢迎来到天天文库
浏览记录
ID:44235417
大小:274.50 KB
页数:42页
时间:2019-10-19
《6 Java多线程机制》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第6章Java多线程机制6.1线程概述6.2Thread的子类创建线程6.3使用Runable接口6.4线程的常用方法6.5线程同步6.6线程之间的协作6.7线程联合6.8守护线程6.1线程概述程序是一段静态的代码,它是应用软件执行的蓝本。进程是程序的一次动态执行过程,它对应了程序从加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。线程是比进程更小的执行单位,一个进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的
2、概念。Java的多线程就是在操作系统每次分时给Java程序一个时间片的CPU时间内,在若干个独立的可控制的线程之间切换。Java进程中一定有主线程,负责main方法的执行。在main方法的执行中再创建的线程,就称为程序中的其它线程。如果main方法中没有创建其他的线程,那么当main方法执行完最后一个语句,JVM就会结束我们的Java应用程序。如果main方法中又创建了其他线程,那么JVM就要在主线程和其他线程之间轮流切换,保证每个线程都有机会使用CPU资源,JVM一直要等到程序中的所有线程都结束之后,才结束我们的Ja
3、va应用程序。6.1.1Java中的线程6.1.2线程的状态与生命周期新建当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。此时它已经有了相应的内存空间和其它资源。就绪线程创建之后就具备了运行的条件,一旦调度机制把CPU时间片分配给线程,线程开始运行了(运行run()方法)。死亡run方法结束。此时,调度机制将释放掉分配给线程的内存。阻塞线程能够运行,但有某个条件阻止它的运行。此时,调度机制将忽略该线程,不会给线程分配CPU时间片。6.1.3启动线程线程创建后仅仅是占有了内存资源,也即现在处
4、于新建状态,在JVM管理的线程中还没有这个线程。线程必须调用start()方法通知JVM,也即处于就绪状态,这时JVM就会知道又有一个新一个线程排队等候切换了。线程启动后,由线程执行机制调用run()。6.1.4阻塞线程一个线程进入阻塞状态,可能有如下原因:调用sleep(intmillisecondes)使线程进入休眠状态。线程要执行一段同步代码,由于无法获得相关的同步锁而陷入阻塞状态,只有等获得了同步锁,才能进入就绪状态。线程试图在某个对象上调用其同步控制方法,但是对象锁不可用。通过调用wait()使线程挂起。直到
5、线程得到notify()或notifyAll()消息,线程才会进入就绪状态。线程在等待某个输入/输出完成。6.2Thread的子类创建线程用Thread子类创建线程对象。编写Thread类的子类时,需要重写父类的run方法,其目的是规定线程的具体操作,否则线程就什么也不做,因为父类的run方法中没有任何操作语句。当调度机制将CPU时间片分配给线程时,如果线程是Thread的子类创建的,该类中的run方法就立刻执行。例子1classLefthandextendsThread{publicvoidrun(){for(int
6、i=1;i<=100;i++){System.out.println("我是左手线程");}}}classRighthandextendsThread{publicvoidrun(){for(inti=1;i<=100;i++){System.out.println("我是右手线程");}}}publicclassExample6_1{publicstaticvoidmain(Stringargs[]){Threadleft=newLefthand();//创建线程Threadright=newRighthand();
7、left.start();right.start();for(inti=1;i<=100;i++){System.out.println("我是主线程");}}}6.3使用Runnable接口实现Runnable接口定义run()方法构造线程:Thread(Runnabletarget);该构造方法中的参数是一个Runnable类型的接口,因此,在创建线程对象时必须向构造方法的参数传递一个实现Runnable接口类的实例,该实例对象称作所创线程的目标对象。当线程调用start方法后,一旦轮到它来享用CPU资源,目标对象
8、就会自动调用接口中的run方法(接口回调)。例子2classLefthandimplementsRunnable{publicvoidrun(){for(inti=1;i<=109;i++){System.out.println("我是左手线程");}}}classRighthandimplementsRunnable{publi
此文档下载收益归作者所有