JavaSE线程1.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

源自清华值得信赖中国移动互联网研发培训专家--多线程源自清华值得信赖中国移动互联网研发培训专家1.掌握JAVA中进程的概念2.掌握JAVA中线程的概念3.掌握线程的创建方式4.掌握线程的优先级5.掌握线程的常用方法6.掌握线程的生命周期7.掌握线程的停止源自清华值得信赖中国移动互联网研发培训专家进程(Process)◦每个独立执行的程序称为进程线程(Thread)◦线程是一个程序内部的一条执行路径,Java虚拟机允许应用程序并发地运行多个执行路径线程和进程的区别◦每个进程都有独立的代码和数据空间(进程上下文),进程间的切换开销大◦线程:同一进程内的线程共享代码和数据空间,线程切换的开销小◦多进程:在操作系统中能同时运行多个任务(程序)◦多线程:在同一应用程序中多条执行路径同时执行源自清华值得信赖中国移动互联网研发培训专家两种创建新线程的方式◦第一种:将类声明为Thread的子类并重写run()方法classMyThreadextendsThread{publicvoidrun(){…}}创建此线程类的实例并启动:MyThreadthread1=newMyThread();thread1.start();◦第二种:定义实现Runnable接口的类Runnable接口中只有一个方法publicvoidrun();用来定义线程运行体:classMyRunimplementsRunnable{publicvoidrun(){…}}创建线程的实例的时候将这个类的实例作为参数传递到线程实例内部。然后再启动:Threadthread1=newThread(newMyRun());thread1.start();源自清华值得信赖中国移动互联网研发培训专家publicclassTestThread2{publicstaticvoidmain(String[]args){MyThreadthread1=newMyThread();thread1.start();for(inti=0;i100;i++){System.out.println(-------MainThread:+i);}}}classMyThreadextendsThread{publicvoidrun(){for(inti=0;i100;i++){System.out.println(MyThread:+i);}}}源自清华值得信赖中国移动互联网研发培训专家publicclassTestThread1{publicstaticvoidmain(String[]args){Runnerrunner=newRunner();Threadthread1=newThread(runner);thread1.start();for(inti=0;i100;i++){System.out.println(-------MainThread:+i);}}}classRunnerimplementsRunnable{publicvoidrun(){for(inti=0;i100;i++){System.out.println(runner:+i);}}}源自清华值得信赖中国移动互联网研发培训专家使用Runnable接口◦还可以从其他类继承;直接继承Thread类◦不能再从其他类继承;◦编写简单,可以直接操纵线程使用实现Runnable接口的方式创建线程时可以为相同程序代码的多个线程提供共享的数据。源自清华值得信赖中国移动互联网研发培训专家Java的线程是通过java.lang.Thread类来实现的。当程序启动运行时,JVM会产生一个线程(主线程),主方法(main方法)就是在这个线程上运行的。可以通过创建Thread的实例来创建新的线程。◦每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。◦通过调用Thread类的start()方法来启动一个线程。线程进入Runnable(可运行)状态,它将向线程调度器注册这个线程。◦调用start()方法并不一定马上会执行这个线程,正如上面所说,它只是进入Runnable而不是Running。注意,不要直接在程序中调用线程的run()方法。源自清华值得信赖中国移动互联网研发培训专家publicvoidstart()◦使该线程开始执行publicstaticThreadcurrentThread()◦返回对当前正在执行的线程对象的引用publicfinalbooleanisAlive()◦测试线程是否处于活动状态publicThread.StategetState()◦返回该线程的状态publicfinalStringgetName()◦返回该线程的名称publicfinalvoidsetName(Stringname)◦改变线程名称publicfinalvoidsetDaemon(booleanon)◦将该线程标记为守护线程或用户线程源自清华值得信赖中国移动互联网研发培训专家Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。优先级高的线程会获得较多的运行机会。◦Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三个静态常量:staticintMAX_PRIORITY线程可以具有的最高优先级,取值为10。staticintMIN_PRIORITY线程可以具有的最低优先级,取值为1。staticintNORM_PRIORITY分配给线程的默认优先级,取值为5。Thread类的setPriority()和getPriority()方法分别用来设置和获取线程的优先级。10源自清华值得信赖中国移动互联网研发培训专家publicclassTestPriority{publicstaticvoidmain(String[]args){Threadt0=newThread(newR());Threadt1=newThread(newR());t0.setPriority(Thread.NORM_PRIORITY+5);t0.start();t1.start();}}classRimplementsRunnable{publicvoidrun(){for(inti=0;i100;i++){System.out.println(Thread.currentThread().getName()+:+i);}}}11源自清华值得信赖中国移动互联网研发培训专家线程睡眠:◦Thread.sleep(longmillis)throwsInterruptedException方法,使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。线程让步:◦Thread.yield()方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。线程加入:◦join()throwsInterruptedException方法在当前线程中调用另一个线程的join()方法,则当前线程转入WAITING状态,直到另一个线程运行结束,当前线程再由阻塞转为就绪状态。源自清华值得信赖中国移动互联网研发培训专家publicclassTestThreadYield{publicstaticvoidmain(String[]args){System.out.println(主线程:+Thread.currentThread().getName());Threadthread1=newThread(newMyThread2());thread1.start();Threadthread2=newThread(newMyThread2());thread2.start();}}classMyThread2implementsRunnable{publicvoidrun(){for(inti=0;i100;i++){System.out.println(Thread.currentThread().getName()+:+i);if(i%10==0){Thread.yield();//线程让步}}}}源自清华值得信赖中国移动互联网研发培训专家publicclassTestThreadJoin{publicstaticvoidmain(String[]args){Threadthread1=newThread(newMyThread3());thread1.start();for(inti=1;i=100;i++){System.out.println(Thread.currentThread().getName()+:+i);if(i==50){try{thread1.join();//线程合并}catch(InterruptedExceptione){e.printStackTrace();}}}}}classMyThread3implementsRunnable{publicvoidrun(){for(inti=1;i=50;i++){System.out.println(Thread.currentThread().getName()+:+i);try{Thread.sleep(100);}catch(InterruptedExceptione){e.printStackTrace();}}}}源自清华值得信赖中国移动互联网研发培训专家线程等待:◦Object类中的wait()throwsInterruptedException方法,导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()唤醒方法。线程唤醒:◦Object类中的notify()方法,唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的。◦Object类中的notifyAll()方法,唤醒在此对象监视器上等待的所有线程。这三个方法只能在被同步化(synchronized)的方法或代码块中调用。源自清华值得信赖中国移动互联网研发培训专家如果线程的run()方法中执行的是一个重复执行的循环,可以提供一个标记来控制循环是否执行。如果线程因为执行sleep()或是wait()而进入了阻塞状态,此时要想停止它,可能使用interrupt(),程序会抛出InterruptException异常。如果程序因为输入/输出的等待而阻塞,基本上必须等待输入/输出的动作完成才能离开阻塞状态。无法用interrupt()方法来使得线程离开run()方法,要想离开,只能通过引发一个异常。源自清华值得信赖中国移动互联网研发培训专家publicclassThreadEndTest{publicstaticvoidmain(String[]args){SomeThreadsome=newSomeThread();Threadthread1=newThread(some);thread1.start();try{Thread.sleep(5000);}catch(InterruptedExceptione){e.printStackTrace();}some.terimate();}}classSomeThreadimplementsRunnable{privatebooleanflag=true;publicvoidterimate(){this.flag=false;}publicvoidrun(){while(flag){System.out.println(...run...);}}}17源自清华值得信赖中国移动互联网研发培训专家线程的状态:要想实现多线程,必须在主线程中创建新的线程对象。任何线程都具有五种状态:创建、就绪、运行、阻塞、终止。创建终止start()就绪状态运行状态阻塞状态导致阻塞的事件阻塞解除调度

1 / 23
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功