您好,欢迎访问三七文档
多线程机制1.1Java多线程机制(概念掌握,理解性内容)1.2多线程的实现方法(重点及难点)1.3多线程状态及调度(重点)1.4线程同步1.5线程通信1.1Java多线程机制1.1.1线程的基本概念线程的概念:线程就是应用程序中的一个可执行线索,多线程就是同一个应用程序中有多个可执行线索,它们可以并发执行。为什么要有多线程?线程与进程的区别:–可否独立运行?–内存空间?多线程机制一个建立线程的例子:publicclassSimpleRunnableimplementsRunable{privateStringmessage;publicstaticvoidmain(Stringargs[]){SimpleRunnabler1=newSimpleRunnable(Hello);Threadt1=newThread(r1);t1.start();}publicSimpleRunnable(Stringmessage){this.message=message;}publicvoidrun(){for(;;){System.out.println(message);}}线程开始执行时,它在publicvoidrun()方法中执行。该方法是定义的线程执行起点,像应用程序从main()开始一样。首先main()方法构造SimpleRunnable类的实例。实例有自己的一个String数据,初始化为Hello。由实例传入Thread类构造器,这是线程运行时处理的数据。执行的代码是实例方法run()。1.2多线程的实现方法重点与要点:两种实现方法–创建Thread子类–生成一个类,声明实现Runnable接口创建Thread类的子类用这种方法生成新线程,可以按以下步骤进行:1.生成Thread类的子类。classMyThreadextendsThread2.在子类中重写run()方法。publicvoidrun()3.生成子类的对象,并且调用start()方法启动新线程。MyThreadthread=newMyThread();thread.start();start()方法将调用run()方法执行线程。实现Thread子类方法的多线程示例classFirstThreadextendsThread{publicvoidrun(){try{System.out.println(Firstthreadstartsrunning.);for(inti=0;i6;i++){System.out.println(First+i);sleep(1000);}System.out.println(Firstthreadfinishesrunning.);}catch(InterruptedExceptione){}}}实现Thread子类方法的多线程示例classSecondThreadextendsThread{publicvoidrun(){try{System.out.println(\tSecondthreadstartsrunning.);for(inti=0;i6;i++){System.out.println(\tSecond+i);sleep(1000);}System.out.println(\tSecondthreadfinishesrunning);}catch(InterruptedExceptione){}}}实现Thread子类方法的多线程示例publicclassThreadTest1{publicThreadTest1(){FirstThreadfirst=newFirstThread();SecondThreadsecond=newSecondThread();first.start();second.start();}publicstaticvoidmain(String[]args){newThreadTest1();}}结果为:Firstthreadstartsrunning.First0Secondthreadstartsrunning.Second0First1Second1First2Second2First3Second3First4Second4First5Second5Firstthreadfinishesrunning.Secondthreadfinished.Thread子类线程小结(加深理解)需要深入理解线程的run()以及start()方法:start()方法将调用run()方法执行线程。run()方法就是新线程完成具体工作的地方。注意通过对比加深了解:程序的入口,main()方法。线程的入口,run()方法。Applet的入口,init()方法。创建线程的方式run方法是运行线程的主体,启动线程时,由java直接调用publicvoidrun()停止线程,由小应用程序的stop调用线程的stopthread.stop()sleep方法的作用,暂停线程的执行,让其它线程得到机会,sleep要丢出异常,必须捕获。Try{sleep(100)}catch(InterruptedExceptione){}1.2多线程实现方法2.实现Runnable接口什么是Runnable接口?a)Runnable是java.lang包中的一个接口。b)定义了创建和执行线程的功能。c)定义了run()方法,完成具体任务的地方。实现Runnable接口实现Runnable接口的主要步骤:①定义一个类实现Runnable接口,classFirstThreadimplementsRunnable②并且在该类中实现run()方法。publicvoidrun()②生成这个类的对象。FirstThreadfirst=newFirstThread();③用Thread(Runnabletarget)构造函数生成Thread对象,然后调用start()方法启动线程。Threadthread1=newThread(first);thread1.start();实现Runnable接口多线程示例classFirstThreadimplementsRunnable{publicvoidrun(){try{System.out.println(Firstthreadstartsrunning.);for(inti=0;i6;i++){System.out.println(First+i);Thread.sleep(1000);}System.out.println(Firstthreadfinishesrunning.);}catch(InterruptedExceptione){}}}classSecondThreadimplementsRunnable{publicvoidrun(){try{System.out.println(\tSecondthreadstartsrunning.);for(inti=0;i6;i++){System.out.println(\tSecond+i);Thread.sleep(1000);}System.out.println(\tSecondthreadfinished.);}catch(InterruptedExceptione){}}}实现Runnable接口多线程示例publicclassRunTest{publicRunTest(){FirstThreadfirst=newFirstThread();SecondThreadsecond=newSecondThread();Threadthread1=newThread(first);Threadthread2=newThread(second);thread1.start();thread2.start();}publicstaticvoidmain(String[]args){newRunTest();}}结果为:Firstthreadstartsrunning.First0Secondthreadstartsrunning.Second0First1Second1First2Second2First3Second3First4Second4First5Second5Firstthreadfinishesrunning.Secondthreadfinished.两种多线程实现方法之对比相同点:都可以实现多线程不同点:灵活性:Runnable接口较灵活。应用范围:RunnableThread类的子类。1.3多线程状态及调度1.线程的状态具有四种状态:–新生态:已分配内在,未高度–可执行态:start()–阻塞态–停止态:stop()线程状态四种状态的相关概念生命周期如下:1.新建:当一个Thread类或其子类的对象被创建后,进入这个状态。这时,线程对象已被分配内存空间,其私有数据已被初始化,但该线程还未被调度,可用start()方法调度,或用stop()方法中止。新生线程一旦被调度,就将切换到可执行状态。线程状态2.可运行:处于可执行环境中,随时可以被调度而执行。它可细分为两个子状态:运行状态,已获得CPU,正在执行;就绪状态,只等待处理器资源。这两个子状态的过渡由执行调度器来控制。3.阻塞:由某种原因引起线程暂停执行的状态。线程状态4.死亡:线程执行完毕或另一线程调用stop()方法使其停止时,进入这种停止状态。它表示线程已退出可运行状态,并且不再进入可运行状态。1.3.2线程优先级及调度问题:线程为什么需要调度?为什么引入优先级?应用程序中的多个线程能够并发执行,但从系统的内部来看,所有线程仍然是串行的一个一个地执行,那么如何来决定哪一个线程先执行,哪一个线程后执行呢?Java引入了优先级的概念,优先级就是线程获得CPU而执行的优先程度,优先级越高,获得CPU的权力越大,执行的机会越多,执行的时间也越长。线程优先级Java把优先级划分为10级,用1至10的整数表示,数值越大,优先级越高。在Thread类中定义了三个优先级常量:MIN_PRIORITY,MAX_PRIORITY和NORM_PRIORITY,其值分别为1,10,5。在为线程分配优先级时,其值应该在1至10之间,否则将出错。如果应用程序没有为线程分配优先级,则Java系统为其赋值为NORM_PRIORITY。线程调度原则调度就是分配CPU资源,确定线程的执行顺序。Java采用抢占式调度方式,即高优先级线程具有剥夺低优先级线程执行的权力。如果一个低优先线程正在执行,这时出现一个高优先级线程,那么低优先级线程就只能停止执行,放弃CPU,推回到等待队列中,等待下一轮执行,而让高优先级线程立即执行。如果线程具有相同的优先级,则按先来先服务的原则调度。线程调度原则问题:如果高优先级抢占了低优先级的线程后,一直占据CPU,低优先级的线程如何获得控制权?有两个方法可以改变这种现象:一是调用sleep()方法,暂时进入睡眠状态,从而让出CPU,使有相同优先级线程和低优先级线程有执行的机会。二是调用yield()而放弃CPU,这时和它有相同优先级的线程就有执行的机会。1.3.3线程的控制必须了解Java程序的线程结构:每个Java程序都有一个缺省的主线程:Application,主线程是main方法执行的线索;Applet,主线程指挥浏览器加载并执行Java小程序。要想实现多线程,必须在主线程中创建新的线程对象。线程的状态转换图阻塞死亡可运行suspend()sleep()wait()I/Oblockingresume()sleeptime_outnotify()I/Ofinished新建new语句start()Stop()Stop()Stop()线程控制方法Thread类定义了许多控制线程执行的方法。▼程序中经常使用下面的方法,对线程进行控制:start():
本文标题:java多线程课件
链接地址:https://www.777doc.com/doc-3704458 .html