资源描述
Click to edit Master title style,Click to edit Master text stylesgood1,Second levelgood2,Third levelgood3,Fourth levelgood4,Fifth levelgood5,E-MAIL:,JAVA 应用开发详解,第9章:多线程,线程常用操作方法,MLDN,软件教学研发部,本章目标,了解设置和取得线程名称,了解线程的强制运行,了解线程的休眠,了解线程的礼让,了解线程的中断操作,线程操作的主要方法,No.,方法名称,类型,描述,1,public Thread(Runnable target),构造,接收Runnable接口子类对象,实例化Thread对象,2,public Thread(Runnable target,String name),构造,接收Runnable接口子类对象,实例化Thread对象,并设置线程名称,3,public Thread(String name),构造,实例化Thread对象,并设置线程名称,4,public static Thread currentThread(),普通,返回目前正在执行的线程,5,public final String getName(),普通,返回线程的名称,6,public final int getPriority(),普通,发挥线程的优先级,7,public boolean isInterrupted(),普通,判断目前线程是否被中断,如果是,返回true,否则返回false,8,public final boolean isAlive(),普通,判断线程是否在活动,如果是,返回true,否则返回false,9,public final void join()throws InterruptedException,普通,等待线程死亡,10,public final synchronized void join(long millis)throws InterruptedException,普通,等待millis毫秒后,线程死亡,11,public void run(),普通,执行线程,12,public final void setName(String name),普通,设定线程名称,13,public final void setPriority(int newPriority),普通,设定线程的优先值,14,public static void sleep(long millis)throws InterruptedException,普通,使目前正在执行的线程休眠millis毫秒,15,public void start(),普通,开始执行线程,16,public static void yield(),普通,将目前正在执行的线程暂停,允许其它线程执行,17,public final void setDaemon(boolean on),普通,将一个线程设置成后台运行,18,public final void setPriority(int newPriority),普通,更改线程的优先级,取得和设置线程名称,在Thread类中,可以通过getName()方法取得线程的名称,通过setName()方法设置线程的名称。,线程的名称一般在启动线程前设置,但也允许为已经运行的线程设置名称。允许两个Thread对象有相同的名字,但为了清晰,应该尽量防止这种情况的发生。,另外,如果程序并没有为线程指定名称,那么系统会自动的为线程分配一个名称。,设置和取得线程的名字,class,MyThread,implements,Runnable,/实现Runnable接口,public,void,run(),/覆写接口中的run()方法,for,(,int,i=0;i3;i+),/循环输出3次,System.,out,.println(Thread.,currentThread,().getName(),+,运行,i=,+i);,/取得当前线程的名字,;,public,class,ThreadNameDemo,public,static,void,main(String args),MyThread my=,new,MyThread();,/定义Runnable子类对象,new,Thread(my).start();,/系统自动设置线程名称,new,Thread(my,线程-A,).start();,/手工设置线程名称,new,Thread(my,线程-B,).start();,/手工设置线程名称,new,Thread(my).start();,/系统自动设置线程名称,new,Thread(my).start();,/系统自动设置线程名称,;,程序说明,从运行结果中发现没有设置线程名称的其余三个线程对象的名字都是很有规律的:Thread-0、Thread-1、Thread-2,从之前讲解的static关键字可以知道,在Thread类中必然存在一个static类型的属性,用于为线程自动命名。,观察程序的输出,class,MyThread,implements,Runnable,/实现Runnable接口,public,void,run(),/覆写接口中的run()方法,for,(,int,i=0;i3;i+),/循环输出3次,System.,out,.println(Thread.,currentThread,().getName(),+,运行,i=,+i);,/取得当前线程的名字,;,public,class,CurrentThreadDemo,public,static,void,main(String args),MyThread my=,new,MyThread();,/定义Runnable子类对象,new,Thread(my,线程,).start();,/启动线程,my.run();,/直接调用run方法,;,判断线程是否启动,通过Thread类之中的start()方法通知CPU这个线程已经准备好启动,之后就等待分配CPU资源,运行此线程了。那么如何判断一个线程是否已经启动了呢?在Java中可以使用isAlive()方法来测试线程是否已经启动而且仍然在启动。,判断线程是否启动,class,MyThread,implements,Runnable,/实现Runnable接口,public,void,run(),/覆写run()方法,for,(,int,i=0;i ,+i);,/取得当前线程名称,;,public,class,ThreadAliveDemo,public,static,void,main(String args),MyThread mt=,new,MyThread();,/实例化对象,Thread t=,new,Thread(mt,线程,);,/实例化Thread对象,System.,out,.println(,线程开始执行之前-,+t.isAlive();,/判断是否启动,t.start();,/启动线程,System.,out,.println(,线程开始执行之后-,+t.isAlive();,/判断是否启动,for,(,int,i=0;i ,+i);,/输出,System.,out,.println(,代码执行之后-,+t.isAlive();,/后面的输出结果不确定,;,线程的强制运行,在线程操作中,可以使用join()方法让一个线程强制运行,线程强制运行期间,其他线程无法运行,必须等待此线程完成之后才可以继续执行。,线程的强制运行,class,MyThread,implements,Runnable,/实现Runnable接口,public,void,run(),/覆写run()方法,for,(,int,i=0;i ,+i);,/输出线程名称,;,public,class,ThreadJoinDemo,public,static,void,main(String args),MyThread mt=,new,MyThread();,/实例化对象,Thread t=,new,Thread(mt,线程,);,/实例化Thread对象,t.start();,/线程启动,for,(,int,i=0;i 10),/判断变量内容,try,t.join();,/线程t进行强制运行,catch,(Exception e),/需要进行异常处理,System.,out,.println(,Main 线程运行-,+i);,;,线程的休眠,在程序中允许一个线程进行暂时的休眠,直接使用Thread.sleep()方法即可。,线程的休眠,class,MyThread,implements,Runnable,/实现Runnable接口,public,void,run(),/覆写run()方法,for,(,int,i=0;i 5;i+),/循环5次,try,Thread.,sleep,(500);,/线程休眠,catch,(Exception e),/需要异常处理,System.,out,.println(Thread.,currentThread,().getName(),+,运行,i=,+i);,/输出线程名称,;,public,class,ThreadSleepDemo,public,static,void,main(String args),MyThread mt=,new,MyThread();,/实例化对象,new,Thread(mt,线程,).start();,/启动线程,;,中断线程,当一个线程运行的时候,另外一个线程可以直接通过interrupt()方法,中断其运行状态。,线程的中断,class,MyThread,implements,Runnable,/实现Runnable接口,public,void,run(),/覆写run()方法,System.,out,.println(,1、进入run方法,);,try,Thread.,sleep,(10000);,/休眠10秒,System.,out,.println(,2、已经完成休眠,);,catch,(Exception e),System.,out,.println(,3、休眠被终止,);,return,;,/让程序返回被调用处,System.,out,.println(,4、run方法正常结束,);,;,public,class,ThreadInterruptDemo,public,static,void,main(String args),MyThread mt=,new,MyThread();,/实例化子类对象,Thread t=,new,Thread(mt,线程,);,/实例化线程对象,t.start();,try,Thread.,sleep,(2000);,/稍微停2秒再继续中断,catch,(Exception e),t.interrupt();,/中断线程执行,;,后台线程,在Java程序中,只要前台有一个线程在运行,那么整个java进程都不会消失,所以此时可以设置一个后台线程,这样即使Java进程结束了,此后台线程依然会继续执行。要想实现这样的操作,直接使用setDaemon()方法即可。,后台线程的设置,class,MyThread,implements,Runnable,/实现Runnable接口,public,void,run(),/覆写run()方法,while,(,true,),/无限制循环,System.,out,.println(Thread.,currentThread,(),.getName()+,在运行。,);,/输出线程名称,;,public,class,ThreadDaemonDemo,public,static,void,main(String a
展开阅读全文