您的位置:首页 > 编程语言 > Java开发

Java多线程概念

2020-08-03 18:01 10 查看

多线程相关概念

进程:狭义上是指程序运行的实例,广义上是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元。进程中可以有很多线程

线程:是程序执行的最小单元,是CPU调度和分配的基本单位。

两者区别:

  1. 资源上看,进程主要考虑cpu和内存,线程主要考虑CPU调度。
  2. 进程消耗CPU资源多,线程少
  3. Java中,Java程序都是运行在JVM进程上的,所以程序都是以线程方式执行在JVM进程中。

并行 (parallel):指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。需要多处理器

并发 (concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。仅在一个处理器上就可以

Java中的多线程

1、继承thread类

继承thread类,并重写run方法,实例化该类对象,调用start方法

2、实现runnable接口

实现 runnable接口,并重写run方法,实例化该类对象,并实例化一个thread类的对象并把实现runnable 接口的对象作为参数传入thread对象中(或者使用匿名内部类),调用thread类对象的 start方法

两种创建线程的方式,第二种 (实现 Runnable 接口) 要好一些,因为第一种创建方法继承了 Thread 后就无法继承其他父类。

3、实现callable接口

Callable只能用于线程池
待更新

ThreadLocal

1、使用

​ ThreadLocal 是线程的局部变量, 是每一个线程所单独持有的,其他线程不能对其进行访问。当使用 Thread Local 维护变量的时候 为每一个使用该变量的线程提供一个独立的变量副本,即每个线程内部都会有一个该变量,这样同时多个线程访问该变量并不会彼此相互影响,因此他们使用的都是自己从内存中拷贝过来的变量的副本, 这样就不存在线程安全问题,也不会影响程序的执行性能。最常见的 ThreadLocal 使用场景为:数据库连接、 Session 管理

2、使用

Thread 在内部是通过 ThreadLocalMap 来维护 ThreadLocal 变量表, 在 Thread 类中有一个 threadLocals 变量,是 ThreadLocalMap 类型的,它就是为每一个线程来存储自身的 ThreadLocal 变量的, ThreadLocalMap 是 ThreadLocal 类的一个内部类,这个 Map 里面的最小的存储单位是一个 Entry, 它使用 ThreadLocal 作为 key, 变量作为 value,这是因为在每一个线程里面,可能存在着多个 ThreadLocal 变量。

ThreadLocal 是线程 Thread中属性 threadLocals 的管理者。提供set、get、remove等方法。

具体使用,在线程中调用 ThreadLocal类的set方法或者get方法,相应的方法会获得当前线程,并对该线程的 threadLocals 变量进行相应的操作(该变量类型是ThreadLocalMap )

同步机制采用了 “以时间换空间” 的方式,而 ThreadLocal 采用了 “以空间换时间” 的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。

线程的状态及方法

线程状态:创建、就绪、运行、阻塞、死亡

Thread 类方法

  • isAlive(): 判断线程是否还活着。

  • currentThread(): 返回值为 Thread,返回当前线程对象。

  • sleep(long millis):让线程睡眠多少毫秒。

  • join(long millis): 让调用该方法的线程A强制插队到当前线程B的前面并等待A执行相应的时间。

  • yield(): 将当前正在执行的线程退让出去,以让就绪队列中的其他线程有更大的几率被 cpu 调度。即强制自己放弃 cpu,并将自己放入就绪队列。

Wait和sleep区别

sleep () 和 wait () 方法都是 Java 中造成线程阻塞的方法。

1.类不同

  • sleep 方法是 Thread 类的静态方法

  • wait () 是 Object 超类的成员方法

    2.时间不同

  • sleep()必须指定时间

  • wait()可以指定也可以不指定时间,不指定的时候需要notify或者notifyall使其变为就绪。

    3.释放锁不同

  • **sleep ()释放 CPU 执行权**不释放同步锁;

  • wait () 释放 CPU 执行权,也释放同步锁,使得其他线程可以使用同步控制块或者方法。

    4.使用地点

  • sleep 方法可以在任何地方使用,

  • wait 方法只能在同步方法和同步代码块中使用

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: