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类的一些重要方法:

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

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值