201711671229 《Java程序设计》第十二章学习总结

第十二章《Java多线程机制》

本章内容包括:Java中的线程、Thread类与线程的创建、线程的常用方法、线程同步、协调同步的线程、线程联合、GUI线程、计时器线程。

一、进程与线程

1  操作系统与进程

进程是程序的一次动态执行过程。现代操作系统可以同时管理计算机系统的多个线程

2  进程与线程

线程不是进程,线程是比进程更小的执行单位,线程的中断与恢复可以更加节省系统的开销。

二、Java中的线程

1   Java的多线程机制

Java语言的一大特性点就是内置对多线程的支持,多线程指一个应用程序中同时存在几个执行体,按几条不同的执行线索共同工作的情况。

2   主线程(main)线程

Java程序总是从主类的main方法开始执行。

三、线程的状态与生命周期

1  新建: 当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。

2  运行 :线程必须调用start()方法(从父类继承的方法)通知JVM,这样JVM就会知道又有一个新一个线程排队等候切换了。一旦轮到它来享用CPU资源时,此线程的就可以脱离创建它的主线程独立开始自己的生命周期了。  

3  中断:有4种原因的中断:

–JVM将CPU资源从当前线程切换给其他线程,使本线程让出CPU的使用权处于中断状态。

–线程使用CPU资源期间,执行了sleep(int millsecond)方法,使当前线程进入休眠状。

–线程使用CPU资源期间,执行了wait()方法。

–线程使用CPU资源期间,执行某个操作进入阻塞状态。

4  死亡 :处于死亡状态的线程不具有继续运行的能力。线程释放了实体。

四、线程调度与优先级

每个java线程的优先级都在常数1-10之间。如果没有明确地设置线程的优先级,每个线程的优先级都为常数5,即Thread.NORM_PRIORITY。

优先级可以调用setPriority(int grade)方法调整,如果参数grade不在1-10范围内,那么会产生一个IllegalArgumentException异常。

JVM的线程调度器的任务是使高优先级的线程能始终运行,也就是说,如果有ABCD四个线程,A和B的级别高于C和D,那么java调度器首先以轮流的方式执行A和B,到AB都执行完毕进入死亡状态,才会在CD之间轮流切换。

五、Thread类与线程创建

1    使用Thread的子类

用Thread类的子类创建线程对象,需要重写父类的run()方法;

2    使用Thread类

用该类创建线程对象通常使用的构造方法是Thread(Runnable target);

3   目标对象与线程

从对象和对象之间的关系角度上看,目标对象和线程的关系有一下两种:

--目标对象和线程完全解耦(目标对象的不包含对cat和dog线程对象的引用)

--目标对象组合线程(弱耦合)(将线程作为自己的成员)

4   线程的常用方法:

--start() : 线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了。

--run(): Thread类的run()方法与Runnable接口中的run()方法的功能和作用相同,都用来定义线程对象被调度之后所执行的操作,都是系统自动调用而用户程序不得引用的方法。

--sleep(int millsecond): 优先级高的线程可以在它的run()方法中调用sleep方法来使自己放弃CPU资源,休眠一段时间。  

--isAlive(): 线程处于“新建”状态时,线程调用isAlive()方法返回false。在线程的run()方法结束之前,即没有进入死亡状态之前,线程调用isAlive()方法返回true。

--currentThread():该方法是Thread类中的类方法,可以用类名调用,该方法返回当前正在使用CPU资源的线程。  

--interrupt() :一个占有CPU资源的线程可以让休眠的线程调用interrupt()方法“吵醒”自己,即导致休眠的线程发生InterruptedException异常,从而结束休眠,重新排队等待CPU资源。

六、线程同步

所谓线程同步就是若干个线程都需要使用一个synchronized(同步)修饰的方法,多个线程调用synchronized方法必须遵守同步机制——当线程A使用synchronized 方法时,其他线程想使用这个synchronized 方法时必须等待,直到线程A使用完毕该synchronized 方法。

七、协调同步的线程

--wait()方法可以中断方法的执行,使本线程等待,暂时让出CPU的使用权,并允许其它线程使用这个同步方法。

--notifyAll()方法通知所有的由于使用这个同步方法而处于等待的线程结束等待。曾中断的线程就会从刚才的中断处继续执行这个同步方法,并遵循“先中断先继续”的原则。

--notify()方法只是通知处于等待中的线程的某一个结束等待。
八、线程联合

一个线程A在占有CPU资源期间,可以让其他线程调用join()和本线程联合,我们成A在运行期间联合了B。如果线程A在占有CPU资源期间一旦联合线程B,那么A线程将立即终断执行,直到它联合的线程B执行完毕,A线程再重新排队等待CPU资源。

九、GUI线程

十、计时器线程

当某些操作需要周期性的执行,就可以使用计时器,Timer类的构造方法Timer(int a,Object b)创建一个计时器,参数a的单位是毫秒,参数b是计时器的监视器actionPerformed(ActionEvent e).

start()方法启动计时器,即启动线程;stop()方法停止计时器,即挂起线程。

十一、守护线程

一个线程调用void setDaemon(boolean on)方法可以将自己设置成一个守护(Daemon)线程,例如:thread.setDaemon(true);

当程序中的所有用户线程都已结束运行时,即使守护线程的run方法中还有需要执行的语句,守护线程也立刻结束运行。

  代码行数(新增/累计) 博客量(新增/累计) 学习时间(新增/累计)
目标 5000行 30篇 400个小时(24000分钟)
第十二周 0/3173 1/12 83/3155

猜你喜欢

转载自blog.csdn.net/x1432553805/article/details/84934714
今日推荐