多线程基本概念

短命女 2022-07-12 07:19 397阅读 0赞

多线程是 java 应用程序的一个特点,掌握 java的多线程也是作为一 java程序员必备的知识。多线程指的是在单个程序中可以同时运行多个同的线程执行不同的任务.线程是程序内的顺序控制流, 只能使用分配给序的资源和环境。 还记得刚开始学习的时候总是和进程分不清, 总是对这两个名词所迷惑。下面就首先对这两个名词区分来作为本篇博客的开始:

一、线程与进程的区别

多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,

有可能互相影响. •线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,

所以线程的切换比进程切换的负担要小。多线程编程的目的,就是”最大限度地利用 CPU 资源”,

当某一线程的处理不需要占用 CPU 而只和 I/O 等资源打交道时,让需要占用 CPU 资源的其它

线程有机会获得 CPU 资源。从根本上说,这就是多线程编程的最终目的。

二、了解一下 java 在多线程中的基础知识

1.Java 中如果我们自己没有产生线程,那么系统就会给我们产生一个线程

(主线程, main 方法就在主线程上运行) , 我们的程序都是由线程来执行的。

  1. 进程:执行中的程序(程序是静态的概念,进程是动态的概念)。

  2. 线程的实现有两种方式, 第一种方式是继承 Thread 类 , 然后重写 run 方

法;第二种是实现 Runnable 接口,然后实现其 run 方法。

  1. 将我们希望线程执行的代码放到 run 方法中,然后通过 start 方法来启动线

程,start 方法首先为线程的执行准备好系统资源 , 然后再去调用 run 方法 。 。

当某个类继承了 Thread 类之后,该类就叫做一个线程类。

  1. 一个进程至少要包含一个线程。

  2. 对于单核 CPU 来说,某一时刻只能有一个线程在执行(微观串行),从

宏观角度来看,多个线程在同时执行(宏观并行)。

  1. 对于双核或双核以上的 CPU 来说,可以真正做到微观并行。

三、Thread 源码研究:

1) Thread 类也实现了 Runnable 接口,因此实现了 Runnable 接口中的 run

方法;

2) 当生成一个线程对象时,如果没有为其设定名字,那么线程对象的名字将

使用如下形式:Thread-number,该 number 将是自动增加的,并被所有的

Thread 对象所共享(因为它是 static 的成员变量)。

3) 当使用第一种方式来生成线程对象时,我们需要重写 run 方法,因为

Thread 类的 run 方法此时什么事情也不做。

4)当使用第二种方式生成线程对象时,我们需要实现 Runnable 接口的 run

方法,然后使用 new Thread(new MyThread())(假如 MyThread 已经

实现了 Runnable 接口)来生成线程对象,这时的线程对象的 run 方法或调

就会 MyThread 类的 run 方法,这样我们自己编写的 run 方法就执行了。

说明:

Public void run(){

If(target!=null){

Target.run();

}}

当使用继承 Thread 生成线程对象时,target 为空,什么也不执行,当使用第

二种方式生成时,执行 target.run(),target 为 runnable 的实例对象,即

为执行重写后的方法。

总结:两种生成线程对象的区别:

1.两种方法均需执行线程的 start 方法为线程分配必须的系统资源、 调度线程

运行并执行线程的 run 方法。

2.在具体应用中,采用哪种方法来构造线程体要视情况而定。通常,当一个

线程已继承了另一个类时,就应该用第二种方法来构造,即实现 Runnable

接口。

四:线程的生命周期:

Center

由上图可以看出,一个线程由出生到死亡分为五个阶段:

1 )创建状态

•当用 new 操作符创建一个新的线程对象时,该线程处于创建状态。

•处于创建状态的线程只是一个空的线程对象,系统不为它分配资源

2 )可运行状态

•执行线程的 start()方法将为线程分配必须的系统资源,安排其运行,并调用

线程体—run()方法,这样就使得该线程处于可运行( Runnable )状态。

•这一状态并不是运行中状态(Running ),因为线程也许实际上并未真正运

行。

3)不可运行状态

.当发生下列事件时,处于运行状态的线程会转入到不可运行状态。

调用了 sleep()方法;

•线程调用 wait 方法等待特定条件的满足

•线程输入/输出阻塞

4) 返回可运行状态:

•处于睡眠状态的线程在指定的时间过去后

•如果线程在等待某一条件,另一个对象必须通过 notify()或 notifyAll()方法通

知等待线程条件的改变

•如果线程是因为输入/输出阻塞,等待输入/输出完成

5)消亡状态

当线程的 run 方法执行结束后,该线程自然消亡。

注意:

1.停止线程的方式:不能使用 Thread 类的 stop 方法来终止线程的执行。一

般要设定一个变量,在 run 方法中是一个循环,循环每次检查该变量,如果

满足条件则继续执行,否则跳出循环,线程结束。

2.不能依靠线程的优先级来决定线程的执行顺序。

五:多线程并发

  1. 多线程并发是线程同步中比较常见的现象,java 多线程为了避免多线程并发

解决多线程共享数据同步问题提供了 synchronized 关键字

synchronized 关键字: 当 synchronized 关键字修饰一个方法的时候, 该方法

叫做同步方法。

1.Java 中的每个对象都有一个锁(lock)或者叫做监视器(monitor),当访

问某个对象的 synchronized 方法时,表示将该对象上锁,此时其他任何线程

都无法再去访问该 synchronized 方法了, 直到之前的那个线程执行方法完毕

后(或者是抛出了异常),那么将该对象的锁释放掉,其他线程才有可能再

去访问该 synchronized 方法。

  1. 如果一个对象有多个 synchronized 方法, 某一时刻某个线程已经进入到了

某个 synchronized 方法,那么在该方法没有执行完毕前,其他线程是无法访

问该对象的任何 synchronized 方法的。

3.如果某个 synchronized 方法是 static 的,那么当线程访问该方法时,它锁

的并不是 synchronized 方法所在的对象,而是 synchronized 方法所在的对

象所对应的 Class 对象,因为 Java 中无论一个类有多少个对象,这些对象

会对应唯一一个 Class 对象,因此当线程分别访问同一个类的两个对象的两

个 static,synchronized 方法时,他们的执行顺序也是顺序的,也就是说一

个线程先去执行方法,执行完毕后另一个线程才开始执行。

  1. synchronized 块,写法:

synchronized(object)

{

}

表示线程在执行的时候会对 object 对象上锁。

六: t wait 与 与 notify

1.wait 与 notify 方法都是定义在 Object 类中, 而且是 final 的, 因此会被所有

的 Java 类所继承并且无法重写。这两个方法要求在调用时线程应该已经获

得了对象的锁, 因此对这两个方法的调用需要放在 synchronized 方法或块当

中。当线程执行了 wait 方法时,它会释放掉对象的锁。

  1. 另一个会导致线程暂停的方法就是 Thread 类的 sleep 方法,它会导致线

程睡眠指定的毫秒数,但线程在睡眠的过程中是不会释放掉对象的锁的。

3.notify():唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象

上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决

定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。

发表评论

表情:
评论列表 (有 0 条评论,397人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java线——基本概念

    线程和多线程 程序:是一段静态的代码,是应用软件执行的蓝本 进程:是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生

    相关 线开发的基本概念

    在Android开发中,我们必不可少的会遇到多线程开发。因为Android中的主线程负责更新UI,我们不能在主线程处理耗时逻辑,否则就会造成卡顿甚至出现ANR(程序未响应)等异

    相关 线基本概念

    多线程是 java 应用程序的一个特点,掌握 java的多线程也是作为一 java程序员必备的知识。多线程指的是在单个程序中可以同时运行多个同的线程执行不同的任务.线程是程序

    相关 线基本概念

    基本概念 1. 进程 (Process):一个程序运行起来时在内存中开辟一段空间用来运行程序,这段空间包括 heap、stack、data segment 和 code

    相关 线(一)基本概念

    多线程是java应用程序的一个特点,掌握java的多线程也是作为一 java程序员必备的知识。多线程指的是在单个程序中可以同时运行多个 同的线程执行不同的任务.线程是程序...