Java多线程

Java多线程

 次点击
8 分钟阅读

2025-7-9

多线程是指在一个程序(进程)中同时执行多个线程,每个线程都有自己独立的执行路径,可以同时进行多个任务,从而提高系统的资源利用率和响应性能。

多线程是实现并发和并行的手段,但不是唯一的手段。

在Java中多线程的实现方式有以下三种

  1. 继承Thread(继承Thread类,重写run方法)

  2. 实现Runnable接口(实现runnable接口,重写run方法)

  3. 利用Callable接口和Future接口(可以定义返回值)

Java中的线程安全问题

存在线程安全问题必须满足三个条件:

  1. 有共享变量

  2. 处在多线程环境下

  3. 共享变量有修改操作。

jvm中有一个主内存(Main Memory) ^1 ,每一个线程也有自己的工作内存(Working Memory)^2,一个线程对于一个变量进行操作的时候,都需要在自己的working memory里创建一个变量的副本copy,操作完之后再写入main memory。当多个线程操作同一个变量variable,就可能出现不可预知的结果。

这时,常用的解决方法是给方法或者代码快加锁,例如Java中的synchronized关键字

Java提供的可变字符串类 StringBufferStringBuilder中,前者于Java1.0就开始提供,是线程安全的,在于其中大量使用了同步方法(synchronized)。后者于Java5后引入,为了提高在单线程下字符串操作的效率。

Java中的线程池

线程池(英語:thread pool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。

Java中通过Executors^3 实现线程池,实际上是调用了ThreadPoolExecutor函数,最多有7个参数,其中有两个参数比较有意思,创建线程工厂ThreadFactory以及任务的拒绝策略RejectExecutableHandler,ThreadFactory的作用是用来设定线程创建的方式,RejectExecutableHandler的作用是用来处理被拒绝的任务(task),即超出阻塞队列且无法处理的任务,在Java提供的ThreadPoolExecutor源码中的拒绝策略是作为静态内部类提供的

© 本文著作权归作者所有,未经许可不得转载使用。