1安庆师范学院计算机与信息学院·Java程序设计·@aqtc.edu.cn安庆师范学院计算机与信息学院·Java程序设计·安庆师范学院计算机与信息学院·Java程序设计·11.1线程与线程类11.2线程的创建11.3线程的状态与调度11.4线程状态的改变11.5资源共享与对象锁11.6线程组安庆师范学院计算机与信息学院·Java程序设计·线程与线程类11.1.1线程的概念11.1.2Runnable接口和Thread类3安庆师范学院计算机与信息学院·Java程序设计·线程的概念进程是一个程序关于某个数据集的一次运行。即进程是运行中的程序,是程序的一次运行活动。线程则是进程中的一个单个的顺序控制流。单线程的概念很简单,整个程序中只有一个执行线索多线程是指在单个的程序内可以同时运行多个不同的线程完成不同的任务安庆师范学院计算机与信息学院·Java程序设计·线程的概念很多应用程序是用多线程实现的,如浏览器。在浏览器中,可以边滚动屏幕,边下载Applet或图像,还可以同时播放动画和声音等。多线程与多任务不同。多任务是在操作系统下可同时运行多个程序多线程是在一个程序中的多个同时运行的控制流。4安庆师范学院计算机与信息学院·Java程序设计·类Java语言实现多线程编程的接口和类在java.lang包中定义了Runnable接口和Thread类。Runnable接口中只定义了一个方法,它的格式为:publicabstractvoidrun()这个方法要由实现了Runnable接口的类实现。Runnable对象称为可运行对象,一个线程的运行就是执行可运行对象的run()方法。run()方法也称为线程体。安庆师范学院计算机与信息学院·Java程序设计·类是线程类,该类的常用构造方法如下:publicThread(Runnabletarget,Stringname)publicThread(Stringname)publicThread(Runnabletarget)target为线程运行的目标对象,类型为Runnable,当一个线程对象调用start()方法启动后即运行该目标对象的run()方法,name为线程名。Thread类实现了Runnable接口,因此Thread对象也是可运行对象,若没有指定目标对象,则以当前类对象为目标对象。若没有指定线程名,则由系统指定。5安庆师范学院计算机与信息学院·Java程序设计·类的常用方法publicvoidrun()线程的线程体,通常Thread类的子类覆盖该方法。publicvoidstart()由JVM调用线程的run()方法,启动线程开始执行。publicstaticThreadcurrentThread()返回当前正在执行的线程对象的引用。publicvoidsetName(Stringname)设置线程名。publicStringgetName()返回线程名。publicstaticvoidsleep(longmillis)throwsInterruptedExceptionpublicstaticvoidsleep(longmillis,intnanos)throwsInterruptedException使当前正在执行的线程暂时停止执行指定的毫秒时间。指定时间过后,线程继续执行。该方法抛出InterruptedException异常,必须捕获或声明抛出。安庆师范学院计算机与信息学院·Java程序设计·类的常用方法publicvoidsetDaemon(booleanon)设置线程为Daemon(后台)线程。publicbooleanisDaemon()返回线程是否为Daemon(后台)线程。publicstaticvoidyield()使当前执行的线程暂停执行,允许其他线程执行。publicThreadGroupgetThreadGroup()返回该线程所属的线程组对象。publicvoidinterrupt()中断当前线程。publicbooleanisAlive()返回指定线程是否处于活动状态。6安庆师范学院计算机与信息学院·Java程序设计·线程的创建11.2.1继承Thread类11.2.2实现Runnable接口11.2.3主线程安庆师范学院计算机与信息学院·Java程序设计·线程的创建线程运行的代码就是实现了Runnable接口的类的run()方法或者是Thread类的子类的run()方法,因此构造线程体有两种方法:继承Thread类并覆盖它的run()方法。实现Runnable接口并实现它的run()方法。7安庆师范学院计算机与信息学院·Java程序设计·类通过继承Thread类,并覆盖run()方法,这时就可以用该类的实例作为线程的目标对象。安庆师范学院计算机与信息学院·Java程序设计·{publicSimpleThread(Stringname){super(name);}publicvoidrun(){for(inti=0;i100;i++){System.out.println(getName()+=+i);try{Thread.sleep((int)(Math.random()*100));}catch(InterruptedExceptione){}}System.out.println(getName()+DONE);}}8安庆师范学院计算机与信息学院·Java程序设计·{publicstaticvoidmain(String[]args){Threadt1=newSimpleThread(RunnerA);Threadt2=newSimpleThread(RunnerB);t1.start();t2.start();}}安庆师范学院计算机与信息学院·Java程序设计·接口可以定义一个类实现Runnable接口,然后将该类对象作为线程的目标对象。实现Runnable接口就是实现run()方法。下面程序通过实现Runnable接口构造线程体。9安庆师范学院计算机与信息学院·Java程序设计·{publicvoidrun(){for(inti=0;i100;i++){System.out.println(Thread.currentThread().getName()+=+i);try{Thread.sleep((int)(Math.random()*100));}catch(InterruptedExceptione){}}}}publicclassThreadTest{publicstaticvoidmain(String[]args){Targettarget=newTarget();Threadt1=newThread(target,ThreadA);Threadt2=newThread(target,ThreadB);t1.start();t2.start();}}安庆师范学院计算机与信息学院·Java程序设计·主线程当Java应用程序的main()方法启动运行时,JVM就启动了一个线程,该线程负责创建其他线程,因此称为主线程。请看下面的程序:10安庆师范学院计算机与信息学院·Java程序设计·{publicstaticvoidmain(String[]args){Threadt=Thread.currentThread();//返回当前线程对象System.out.println(t);System.out.println(t.getName());t.setName(MyThread);System.out.println(t);System.out.println(t.getThreadGroup().getName());}}安庆师范学院计算机与信息学院·Java程序设计·线程的状态与调度11.3.1线程的状态11.3.2线程的优先级和调度11安庆师范学院计算机与信息学院·Java程序设计·线程的状态一个线程从创建、运行到结束总是处于下面5个状态之一:新建状态、可运行状态、运行状态、阻塞状态及死亡状态,如图11-3所示。新建状态可运行状态阻塞状态运行状态死亡状态图11-3线程的5种状态安庆师范学院计算机与信息学院·Java程序设计·*;importjava.util.*;importjavax.swing.*;importjava.text.DateFormat;//显示时间的面板类,它实现了Runnable接口classClockPanelextendsJPanelimplementsRunnable{publicvoidpaintComponent(Graphicsg){super.paintComponent(g);Calendarcal=Calendar.getInstance();Datedate=cal.getTime();DateFormatdateFormatter=DateFormat.getTimeInstance();g.setColor(Color.BLUE);g.setFont(newFont(TimesNewRoman,Font.BOLD,36));g.drawString(dateFormatter.format(date),50,50);}12安庆师范学院计算机与信息学院·Java程序设计·(){while(true){repaint();//重新绘制界面try{Thread.sleep(1000);//线程阻塞}catch(InterruptedExceptione){}}}}//JavaApplet类的定义publicclassClockDemoextendsJApplet{privateThreadclockThread=null;privateClockPanelcp=newClockPanel();安庆师范学院计算机与信息学院·Java程序设计·(){add(cp);//