单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,9.1,线程的概念,进程:一个执行中的程序,有自己独立的内存空间等系统资源。,线程:程序中单个顺序的流控制,单个程序中多个线程共享系统资源。,多线程编程:将任务分成多个并发的子任务。,Java,支持多线程。,9.1 线程的概念进程:一个执行中的程序,有自己独立的内存,9.2 Java,线程的创建,继承,Thread,类的方法,实现,Runnable,接口的方法,线程体 有,run,方法(一般是一个循环,需 要以线程方式运行的代码),9.2 Java 线程的创建继承Thread类的方法,1,继承,Thread,类的方法,通过实现,Thread,类的子类、并置换其中的,run,()方法定义线程体,然后创建该子类的对象创建线程。如:,public class Counter extends Thread,public void run()/,定义线程的行为,启动线程,Counter threadCounter=new Counter();,threadCounter.start();,1 继承Thread类的方法通过实现Thread类的子类、并,2,实现,Runnable,接口的方法,通过在类中实现,Runnable,接口,并在该类中提供,run,()方法的实现。如:,public class Counter implements Runnable,public void run()/,定义线程的行为,启动线程,Counter C1=new Counter();,new Thread(C1).start();,Counter C1=new Counter();,Thread t1=new Thread(C1);,t1.start();,2 实现Runnable接口的方法通过在类中实现Runnab,3 Thread,类构造器和,Threadgroup,类,Thread,类构造器:,Thread(),Thread(Runnable),Thread(Threadgroup,Runnable),Thread(String),Thread(Threadgroup,String),Thread(Runnable,String),Thread(Threadgroup,Runnable,String),Runnable:,类的实例,调用,Run,()方法的对象,Threadgroup,:新创建的线程所属的线程组,String,:表示新线程的名字,3 Thread类构造器和Threadgroup类Threa,3 Thread,类构造器和,Threadgroup,类,Threadgroup,类(线程组):所有的线程一定属于某个线程组。属于,Java.lang,包。用于进行统一管理。,显式:,ThreadGroup myThreadGroup=new ThreadGroup(,“,my group of threads,”,),隐式:新创建的线程自动的属于创建该线程的线程所在的线程组。,3 Thread类构造器和Threadgroup类Threa,例 线程概念例子,class PrintThread extends Thread,private int sleepTime;,public PrintThread(String name),super(name);,sleepTime=(int)(Math.random()*5000);,System.out.println(Name:+getName()+,;sleep:+sleepTime);,例 线程概念例子class PrintThread exte,例 线程概念例子,public void run(),try,System.out.println(getName()+going to sleep);,Thread.sleep(sleepTime);,catch(InterruptedException exception),System.err.println(exception.toString();,System.out.println(getName()+done sleeping);,例 线程概念例子 public void run(),例 线程概念例子,public class PrintThreadTest,public static void main(String args),PrintThread thread1=new PrintThread(thread1);,PrintThread thread2=new PrintThread(thread2);,PrintThread thread3=new PrintThread(thread3);,PrintThread thread4=new PrintThread(thread4);,System.out.println(nStarting threads);,thread1.start();,thread2.start();,thread3.start();,thread4.start();,System.out.println(Threads startedn);,例 线程概念例子public class PrintThre,Java多线程程序设计基础篇课件,9.3,线程状态和线程控制,类,Thread,的常用方法,控制和状态的关系,例子,线程状态,对线程进行各种控制,Thread,类中的方法实现,改变,Runnable,状态,Running,状态,Not Runnable,状态,Dead,状态,New Thread,状态,9.3 线程状态和线程控制线程状态对线程进行各种控制Thr,1,类,Thread,的常用方法,方法,简要说明,isAlive(),判断线程目前是否已被启动并且未被终止,wait(),使当前线程处于等待状态,notify(),将正在等待当前管程的线程唤醒,Suspend(),暂停线程的执行,resume(),被方法,Suspend,()暂停的线程继续执行,start(),开始线程的执行,run(),线程中真正执行的程序块,stop(),结束线程的执行,sleep(),让目前正在执行的线程小睡片刻,yield(),自愿将执行的权利交给其它同优先级线程,1 类Thread的常用方法方法简要说明isAlive()判,1,类,Thread,的常用方法,方法,简要说明,join(),暂停当前线程的执行,等待调用该方法的线程结束后在继续执行本线程,interrupt(),中断线程组中所有线程或当前线程,currentThread(),返回当前执行线程的引用对象,setName(,),设置线程的名字,getName(),返回线程的名字,activeCount(),返回当前线程所在线程组中活动线程的个数,getThreadGroup(),返回当前线程所属的线程组名,setDaemon(),设置当前线程为,Daemon,线程,isDaemon(),测试线程是否为,Daemon,线程,1 类Thread的常用方法方法简要说明join()暂停当前,1,类,Thread,的常用方法,方法,简要说明,toString(),返回线程的字符串信息,包括线程的名字、优先级和线程组,enumerate(),把当前线程的线程组中的活动线程拷贝到线程数组中,包括子线程,checkAccess(),确定当前线程是否允许修改该线程,1 类Thread的常用方法方法简要说明toString(),2,控制和状态的关系,创建,可运行,运行中,死亡,其它,阻塞,互斥阻塞,等待阻塞,Start(),调度时间到,运行结束,Yield(),Wait(),Notify(),Interrupt(),Synchronized,Sleep(),Join(),线程结束,或时间到,或,interupt(),获得互斥使用权,不可运行,2 控制和状态的关系创建可运行运行中死亡其它互斥阻塞等待阻塞,3,例子,时钟,import java.awt.Graphics;,import java.util.*;,import java.applet.Applet;,public class Clock extends Applet implements Runnable,Thread clockThread;,public void start(),if(clockThread=null),clockThread=new Thread(this,Clock);,clockThread.start();,public void run(),while(clockThread!=null),repaint();,3 例子时钟import java.awt.Graphic,3,例子,时钟,try clockThread.sleep(1000);,catch(InterruptedException e),public void paint(Graphics g),Calendar now=new GregorianCalendar();,Date trialTime=new Date();,now.setTime(trialTime);,g.drawString(now.get(Calendar.HOUR_OF_DAY)+:+now.get(Calendar.MINUTE)+:+now.get(Calendar.SECOND),5,10);,public void stop(),clockThread =null;,3 例子时钟 try clockThread.sleep,3,例子,时钟,3 例子时钟,9.4,线程优先级和线程的调度,线程的调度取决于线程的优先级。采用先占式调度,先占调度有分为:,独占方式,分时方式,线程的优先级可以用,setPriority(),显式进行设置。,getPriority(),获得优先级。,线程优先级用整数表示。从,1,到,10,,,Thread.MIN_PRIORITY(1),Thread.MAX_PRIORITY(10),Thread.NORM_PRIORITY(5),例,9.4 线程优先级和线程的调度线程的调度取决于线程的优先级,9.4,线程优先级和线程的调度,画线,import java.applet.Applet;,import java.awt.Color;,public class RaceApplet extends Applet implements Runnable,final static int NUMRUNNERS=2;,final static int SPACING=20;,Runner runners=new RunnerNUMRUNNERS;,Thread updateThread=new Thread(this,control);,public void init()for(int i=0;iNUMRUNNERS;i+),runnersi=new Runner();,runnersi.setPriority(i+1);,public boolean mouseDown(java.awt.Event evt,int x,int y),9.4 线程优先级和线程的调度画线import java,9.4,线程优先级和线程的调度,if(!updateThread.isAlive()updateThread.start();,for(int i=0;iNUMRUNNERS;i+),if(!runnersi.isAlive()runnersi.start();,return true;,public void paint(java.awt.Graphics g),g.setColor(Color.lightGray);,g.fillRect(