![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java多线程
Be Like!
征途是星辰大海
展开
-
使用 ReentrantLock 实现双线程顺序打印1-100
import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class Test { private static ReentrantLock lock = new ReentrantLock(); private static Condition even = lock.newCondition(); private static C原创 2021-11-12 10:27:12 · 655 阅读 · 0 评论 -
JAVA 锁
前言1.锁类型锁从宏观上分类,分为悲观锁与乐观锁。(1)乐观锁乐观锁是一种乐观思想,即认为 读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为 别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新), 如果失败则要重复 读-比较-写 的操作。java 中的乐观锁基本都是通过 CAS 操作实现的,CAS 是一种更新的原子操作,比较当前值跟传入 值是否一样,一样则更新,否则失败。(原创 2020-06-27 17:18:01 · 289 阅读 · 0 评论 -
JAVA 后台线程
1.定义:守护线程–也称“服务线程”,他是后台线程,它有一个特性,即为用户线程 提供公共服务,在没有用户线程可服务时会自动离开。2.优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。3.设置:通过 setDaemon(true) 来设置线程为“守护线程”;将一个用户线程设置为守护线程 的方式是在线程对象创建之前 用线程对象的setDaemon方法。4.Daemon:在Daemon线程中产生的新线程也是Daemon的。5.级别:线程是 JVM 级别的,以 Tomcat 为原创 2020-06-26 16:02:22 · 278 阅读 · 0 评论 -
sleep 与 wait、start 与 run 的区别
1、sleep 与 wait 区别对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于 Object类中的。sleep()方法导致了程序暂停执行指定的时间,让出cpu给其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用 notify() 方法后本线程才进入对象锁定池准备获取对象锁原创 2020-06-26 15:51:37 · 905 阅读 · 0 评论 -
终止线程 4 种方式
1、正常运行结束程序运行结束,线程自动结束。2、使用退出标志退出线程一般 run()方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。使用一个变量来控制循环,例如: 最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false来控制while 循环是否退出,代码示例:public class ThreadSafe extends Thread { public volatile b原创 2020-06-26 15:38:10 · 15659 阅读 · 2 评论 -
线程生命周期(状态)
当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。 在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞 (Blocked)和死亡(Dead)5种状态。尤其是当线程启动以后,它不可能一直"霸占"着CPU独自 运行,所以CPU需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换 。)1.新建状态(NEW)当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时仅由JVM为其分配 内存,并初始化其成员变量的原创 2020-06-26 14:49:35 · 2687 阅读 · 0 评论 -
Java线程4中实现创建方式
1、继承Thread类Thread类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread 类的 start() 实例方法。 start() 方法是一个 native 方法,它将启动一个新线程,并执行 run() 方法。public class MyThread extends Thread { public void run() { System.out.println("MyThread.run()"); }}MyThre原创 2020-06-26 10:12:39 · 269 阅读 · 0 评论 -
自定义线程池,批量下载文件
一、创建线程池package threadpool;import java.util.concurrent.*;import java.util.concurrent.atomic.AtomicInteger;/** * 创建自定义线程池 * * author:JZ * date:2019/9/13 */public class CustomThreadPool { ...原创 2019-09-13 22:05:55 · 674 阅读 · 0 评论 -
Java 四种线程池
通常,最开始学Java时,最先接触到线程的就是 Thread 类和 Runnable接口。但是直接用这种方法来实现多线程是有弊端的弊端:a. 每次new Thread新建对象性能差。b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。c. 缺乏更多功能,如定时执行、定期执行、线程中断。相比new Thread,Java提供的四种线程池的好处在...原创 2019-05-30 15:07:17 · 308 阅读 · 0 评论