Java多线程笔记

Java多线程

基本概念

线程 是操作系统能够调度的最小单位,他被包含再进程志宏,是进程中的实际运作单位

进程 进程是程序的基本执行实体

并发和并行

并发:在同一时刻,有多个指令在单个CPU上交替执行

并行 在同一时刻,有多个指令在多个CPU上同时执行

多线程的实现方式

继承Thread类的方式进行实现

直接创建Thread对象

实现Runnable接口的方式进行实现

1.自定义一个类实现Runnable接口

2.重写里面的run方法

3.创建自己类的对象(表示多线程要完成的任务)

4.创建一个Thread对象(创建线程对象)

利用Callable接口和Future接口方式实现

特点:可以获取到多线程的运行结果

1.创建一个类实现Callable接口

2.重写call(有返回值,表示多线程运行的结果)

3.创建实现了Callable接口的实例化对象(表示多线程要执行的任务)

4.创建实现了Future接口的实例化对象FutureTask的对象(用于管理多线程运行的结果)

5.创建一个Thread对象(创建线程对象)

常见的成员方法

static Thread currentThread() 
          返回对当前正在执行的线程对象的引用。 

 void setPriority(int newPriority) 
          更改线程的优先级。 

static void sleep(long millis) 
          在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响 

 void start() 
          使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 

void setName(String name) 
          改变线程名称,使之与参数 name 相同

void join() 
          等待该线程终止。 (插入线程)

static void yield() 
          暂停当前正在执行的线程对象,并执行其他线程(出让线程)

线程的生命周期

图片

线程安全

synchronize锁

同步代码块 把操作共享数据的代码锁起来

//锁是默认打开的,有一个线程进去了,锁自动关闭
//里面的代码全部执行完毕,代码出来,锁自动打开
//锁对象一定要是唯一的,不然一个对象一个锁就失去了锁的意义(可以传递当前类字节码文件的对象 eg.MyThread.class ,保证某一对象的锁的唯一性)

synchronized(){
	操作共享数据的代码
}

同步方法 就是把synchronized关键字加到方法上

//本质和同步代码块是一样的,就是锁住的是一个方法,但是锁的对象不能自己指定
//非静态时对象时this,静态的对象时当前类的字节码对象

权限修饰符 synchronized 返回值类型 方法名(方法参数){···}

lock锁

//相比synchronizd锁可以自己手动的上锁和手动的释放锁
//Lock是接口不能直接实例化,可以用他的实现类ReentrantLock来实例化

void lock() 
          获取锁 

void unlock() 
          释放锁。 

死锁

简单来说就是锁里套锁,在多线程执行过程中可能存在两个线程,一个线程进入了一个大锁,另一个线程进入了这个大锁中的一个小锁,此时进入大锁中的只能等待小锁解锁再进去,假如小锁中有大锁未解开的锁,此时就陷入了俩个线程一起等待,进入死锁

线程池

Executors:线程池的工具类

static ExecutorService newCachedThreadPool() 
          创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。 

static ExecutorService newFixedThreadPool(int nThreads) 
          创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。 

static ThreadFactory defaultThreadFactory() 
          返回用于创建新线程的默认线程工厂 

//自定义线程池
	ThreadPoolExecutor(int corePoolSize, //核心线程数量,可以为负数
			int maximumPoolSize, //最大线程数量 
			long keepAliveTime, //空闲线程最大存活时间
			TimeUnit unit, //时间单位
			BlockingQueue<Runnable> workQueue, //任务队列
			ThreadFactory threadFactory, //创建线程工厂
			RejectedExecutionHandler handler) //任务的拒绝策略

          用给定的初始参数创建新的 ThreadPoolExecutor。(自定义线程池)

当核心线程满的时候再提交任务会派对
当核心线程满,排队满了,就会创建临时线程
当核心线程满,排队满,临时线程满了,会触发任务拒绝策略

posted on   脑子没老子  阅读(13)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示