20165104孟凡斌-第八周作业

20165104孟凡斌-JAVA第八周作业

第八周学习了第十二章得内容

  • 教材学习得内容总结
  • 第七周错题
  • 码云链接

教材学习内容总结

进程与线程

  • 线程比进程还小,一个进程的进行期间可以产生多个线程。

Java的多线程机制。Java内置对多线程的支持。我们的计算机在任何给定说的时刻只能执行线程中的一个,Java虚拟机只是从一个线程迅速地切换到另一个线程。

  • 当main方法中有其他线程时,JVM一直要等到Java应用程序中的所有线程都结束后才会结束Java应用程序。
  • Java语言使用Thread类及其子类的对象来表示线程。新建的线程一般要经历4个状态: ① 创建Thread对象; ② 在第一步创建对象后,该对象仅仅拥有内存次元,需要再调用start()方法才能使得其成为新线程。如果这个线程是Thread的对象,类中的run()方法就立刻执行,且程序必须在子类中重写run()方法。注意,线程没有结束run()方法之前,不要让线程再调用start()方法,否则抛出IllegalThreadStateException异常。 ③ 线程中断:切换给其他线程;执行了sleep(int time)方法,经过time毫秒后,该线程就重新排队,以便从中断处继续运行;执行了wait()方法,线程进入等待状态,此时,其他线程调用notify()方法来使得在等待状态的线程重新排队以便从中断处继续运行;执行某个操作进入阻塞状态时不能进入排队队列。 ④ 线程有两种原因会“死亡”,一是正常运行完了该线程的全部工作;二是run()方法被强制结束。当一个线程“死亡”之后,未死亡的线程会继续轮流占用CPU。
  • 线程是可以设置优先级的(使用setPriority()方法),当优先级高的线程执行完毕时,才会执行低优先级的线程。可以使用getPriority()方法来获得线程的优先级,优先级只能在1~10之间。

Thread类与线程的创建。

  • 可以使用Thread类或者子类创建线程对象,注意子类必须重写run()方法,同时子类可以增加新的成员变量、方法使线程有具体的功能。
  • 若目标对象与线程完全解耦(创建目标对象的列不包含对线程对象的引用),目标对象可以使用
String name=Thread.currentThread().getName();

来获得当前使用CPU资源的线程名字;若目标对象组合线程,则目标对象可以使用

String name=Thread.currentThread();来获得当前使用CPU资源的线程引用。
  • 如果在目标对象中有对其中某个线程进行了“睡眠”处理,那么在计算机运行程序的时候,可以会具有不同的结果。因为线程的进行如果到达指定毫秒数还没有运行完run()方法,那么会先停止,等到睡眠时间结束后再接着运行。

线程的常用方法

  • ①start()方法:只有新创建的线程才可以调用该方法。
  • ②run()方法:该方法是否运行结束是判断线程是否结束的一个重要标准。只有当该方法运行结束后,线程才能再次调用start()方法。
  • ③sleep(int millsecond)方法:线程可以调用该方法来使程序进入睡眠,知道过了参数指定的秒数过后才“醒来”。该方法必须在try-catch语句中调用,因为线程如果在休眠中被打断,会抛出InterruptedException异常。
  • ④isAlive()方法:该方法用来判断线程是否正在运行,若是,返回true,若不是,返回false。注意,一个已经运行的线程在没有进入死亡状态时,不要再给线程分配实体。
  • ⑤currentThread()方法是Thread类中的类方法,返回当前使用CPU的线程。
  • ⑥interrupt()方法用来“唤醒”调用sleep方法而处于睡眠状态的线程。

线程同步

  • 如果有若干个线程需要同时使用一个方法,为了不出现混乱,可以使用synchronized进行修饰。这样一来,该方法只能轮流被调用,直到正在调用该方法的线程使用完该方法后,其他线程才可以调用该方法。

协调同步的线程

  • 当一个线程使用的同步方法中用到了某个变量,而此变量又需要其他线程修改后才能符合本线程的要求,则可以使用wait()方法来中断线程的执行,并允许其他线程使用这个同步方法(sleep方法是做不到这个功能的)。若有线程在运行同步方法时不需要等待,那么需要在用完方法的同时应用notifyAll()方法来通知其他所有处于等待的线程结束等待。只有在同步线程中才可以使用wait(),notify(),notifyAll()方法。

线程联合

  • 线程A在其运行期间,如果其他线程B调用了join()方法和线程A联合,那么A线程会立马中断,直到B线程运行结束A线程才会重新排队。若B线程已经结束,调用join()方法则不会有任何效果。

GUI线程

  • Java包含GUI(图形用户界面)时,会启动多个线程。

计时器线程

  • Java中的javax.swing包中的Timer类可以用来创建计时器:Timer(int a,Object b);,a为毫秒,b为监视器(监视器必须是组件类),每隔a毫秒会执行b一次。注意java.util包中也有一个名字是Timer的类,使用类名时需要注意避免混淆。

守护线程

  • 线程默认是非守护线程,线程在运行之前必须设置自己是否为守护线程。可以调用voidsetDaemon(boolean on)来将自己设置成一个守护线程。当所有非守护线程运行结束时,守护线程一定会跟着结束。

第七周测试错题

NO.1

NO.2

NO.3

NO.4

代码托管

码云链接

原文地址:https://www.cnblogs.com/20165104mfb/p/8906136.html