Java学习——blog 8

目录

Java多线程机制

进程与线程

Java中的线程

线程的状态与生命周期

线程调度与优先级

Thread类与线程的创建

Thread类构造方法

目标对象与线程的关系

线程的常用方法

线程同步

Synchronized关键字

协调同步的线程

计时器线程

守护线程

知识点小结

参考


Java多线程机制

进程与线程

一个进程最少由一个线程组成,可以产生多个线程。
线程是微量级的进程,即运行在进程中的“小进程”。

Java中的线程

Java虚拟机JVM就是一个操作系统:宏观并行,微观串行
每个Java应用程序都有一个缺省的主线程。

JVM在主线与其他线程中轮流切换,保证每个线程都有机会使用CPU资源。

线程的状态与生命周期

新建、运行、中断、死亡
运行:start()方法 run()方法
中断:

  1. 中断状态Interrupt status
  2. sleep()方法
  3. wait()方法
  4. 阻塞状态Blocked status

占用资源->运行
不占用资源->休眠

线程调度与优先级

实时、高、中(优先级设置过高会让其他程序执行受影响)

Thread类与线程的创建

编写Thread类的子类时,必须重写父类的run()方法
类比监听器listener中必须实现的actionPerform()

Thread类构造方法

Thread(Runnable taget)
Runnable接口比使用Thread的子类更具有灵活性。
接口可以有多个,但继承的类只能有一个
There can be more than one interface, but only one inherited class.
sleep()方法可能抛出异常,用try-catch语句包裹

目标对象与线程的关系

目标对象和线程

  • 完全解耦 创建的目标对象不包含对线程对象的引用
  • 组合(弱耦合) 目标对象将线程对象作为自己的成员

线程的常用方法

  • start() —— 只有处于新建状态的线程才可以调用start()。
  • run() —— run()方法中的异常不能用throws,只能用try、catch;因为run()方法在父类中没有抛出任何异常,子类不能比父类抛出更多异常。
  • sleep(int millsecond)  —— Tips:这里是毫秒millisecond 该格式下为millsecond
  • isAlive() —— 未进入死亡状态,返回true;进入死亡状态,返回false。
  • currentThread() —— 可用类名调用,返回当前正在使用CPU资源的线程。
  • interrupt() —— 中断休眠。

下表列出了Thread类的一些重要方法:

序号 方法描述
1 public void start()
使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
2 public void run()
如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
3 public final void setName(String name)
改变线程名称,使之与参数 name 相同。
4 public final void setPriority(int priority)
 更改线程的优先级。
5 public final void setDaemon(boolean on)
将该线程标记为守护线程或用户线程。
6 public final void join(long millisec)
等待该线程终止的时间最长为 millis 毫秒。
7 public void interrupt()
中断线程。
8 public final boolean isAlive()
测试线程是否处于活动状态。

上述方法是被 Thread 对象调用的,下面表格的方法是 Thread 类的静态方法。

序号 方法描述
1 public static void yield()
暂停当前正在执行的线程对象,并执行其他线程。
2 public static void sleep(long millisec)
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
3 public static boolean holdsLock(Object x)
当且仅当当前线程在指定的对象上保持监视器锁时,才返回 true。
4 public static Thread currentThread()
返回对当前正在执行的线程对象的引用。
5 public static void dumpStack()
将当前线程的堆栈跟踪打印至标准错误流。

线程同步

线程同步机制:当一个线程A使用synchronized方法时,其他对象想使用这个synchrnized方法时就必须等待,直到线程A使用完该synchronized方法。

Synchronized关键字

  • synchronized关键字不能继承;
  • 在定义接口与方法时不能使用synchronized关键字修饰;
  • 构造方法不能使用synchronized关键字;
  • synchronized关键字不能用来同步类变量。

协调同步的线程

  • wait() —— 中断线程的执行,使本线程等待,暂时让出CPU的使用权,并允许其他线程使用这个同步方法。
  • notify() —— 等待队列中第一个线程被唤醒
  • notifyAll() —— 遵循“先中断先连续”原则

计时器线程

javax.swing包里提供Timer类,可执行周期性操作。

守护线程

thread.setDaemon(true);

知识点小结

(1)线程是比进程更小的执行单位。一个进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念。

( 2) Java虚拟机(JVM)中的线程调度器负责管理线程,在采用时间片的系统中,每个线程都有机会获得CPU的使用权。当线程使用CPU资源的时间到时后,即使线程没有完成自己的全部操作,Java调度器也会中断当前线程的执行,把CPU的使用权切换给下一个排队等待的线程,当前线程将等待CPU资源的下一次轮回,然后从中断处继续执行。

 (3)线程创建后仅仅是占有了内存资源,在JVM管理的线程中还没有这个线程,此线程必须调用start()方法(从父类继承的方法)通知JVM,这样JVM就会知道又有一个新线程排队等候切换了。

(4)线程同步是指几个线程都需要调用同一个同步方法(用synchronized修饰的方法)。一个线程在使用同步方法时,可能根据问题的需要,必须使用wait()方法暂时让出CPU的使用权,以便其他线程使用这个同步方法。其他线程在使用这个同步方法时如果不需要等待,那么它用完这个同步方法的同时,应当执行 notifyAll()方法通知所有由于使用这个同步方法而处于等待的线程结束等待。

参考

《Java 2实用教程(第5版)》

Java 多线程编程 | 菜鸟教程 (runoob.com)

猜你喜欢

转载自blog.csdn.net/K_savo/article/details/123156323
今日推荐