首页
移动开发
物联网
服务端
编程语言
企业开发
数据库
业界资讯
其他
搜索
java多线程并发全面解析
其他
2020-03-20 09:39:17
阅读次数: 0
线程的创建
有四种方式:
1、实现Runnable接口并重写run()方法
public class StartRun implements Runnable{
public void run() {
}
}
使用://创建实现类对象
StartRun st=new StartRun();
//创建代理类对象
Thread t=new Thread(st);
//启动 开启线程
t.start(); //不保证立即运行,由cpu调用
2、继承Thread类并重写run()方法
public class StartThread extends Thread{
public void run() {
}
}
使用://创建子类对象
StartThread st=new StartThread();
//启动 开启线程
st.start(); //不保证立即运行,由cpu调用
3、使用Collable并重写call()接口
class Run implements Callable{ //里面是泛型
@Override
public Object call() throws Exception {
return null;
}
}
必须使用ExecutorService.submit()方法 调用它
submit会返回一个对象Future,可以使用get()方法来得到该结果
4、使用线程池
ExecutorService exec1=Executors.newCachedThreadPool();
//创建所需数量的线程,在回收线程会停止创建新线程。
ExecutorService exec2=Executors.newFixedThreadPool(4);
//有限个线程执行任务
ExecutorService exec3=Executors.newSingleThreadExecutor();
//一个线程 会序列化任务
ExecutorService exec4=Executors.newScheduledThreadPool(4);
//参数是核心线程数,每隔一段时间重复执行任务。
还有线程池的参数:
corePollSize 核心线程数
queneCapacity 等待队列
MaxPollSize 最大线程数
keepAliveTime 线程空闲时间
keepAliveTime 线程空闲时间
rejectedExecutionHandler 任务拒绝处理器
执行过程
1.当线程数小于核心线程数时,创建线程。
2.当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
3.当线程数大于等于核心线程数,且任务队列已满。(1)若线程数小于最大线程数,创建线程。(2)若线程数等于最大线程数,抛出异常,拒绝任务。
当多个线程需要访问一个共享数据的时候就需要同步,不然会造成数据出错。
线程同步
使用synchronized关键字同步
使用Lock加锁
每次得显示的使用Lock,并且使用try finally去关闭Lock,及unLock
使用:Lock lock=new ReentrantLock();
lock.lock();
try{
}finally{
lock.unlock();
}
使用Lock如果出现了异常可以去处理,但是synchronized只会抛出异常,无法处理。
使用volatile关键字
volatile作为java中的关键词之一,用以声明变量的值可能随时会别的线程修改,使用volatile修饰的变量会强制将修改的值立即写入主存,主存中值的更新会使缓存中的值失效,volatile会禁止指令重排。volatile具有可见性、有序性,不具备原子性。
注意,volatile不具备原子性,这是volatile与java中的synchronized、java.util.concurrent.locks.Lock最大的功能差异。
如果要实现原子性,可以使用原子类AtomicInteger等原子性变量类。
ReentrantLock是一个可重入锁,基本用法和synchronized差不多
后面java为了优化锁还引入了自旋锁(CAS),轻量级锁,偏向锁等。
但是CAS可能会出现ABA问题;及如果线程1将值改为B,线程2将值改为A,当线程3去修改值,到底修改了吗?
线程状态
Thread类包含interrupt()方法,因此可以终止阻塞的任务,这个方法将设置线程的中断状态。
可以使用sleep()和wait()方法让线程进入阻塞状态
sleep和wait区别:
1、wait需要notify和notifyAll方法唤醒,sleep里面的参数是毫秒数,让线程阻塞多长时间。
2、wait会让线程释放锁,而sleep不会释放锁
使用notify和notifyAll方法,或者java.util.concurrent类库中等价的signal()或signalAll()方法,线程才会进入就绪状态。
一个线程可以在其他线程之上调用join()方法,其效果是等待一段时间直到第二个线程结束才恢复。
在使用锁的时候可能会造成死锁
预防死锁的就是银行家算法
总共的资源不仅足够一个线程的需求,还要满足其他线程的需求。
解决死锁的就是哲学家算法
5个哲学家围着吃饭,每个人中间有一个筷子,每个人必须拿着左右两个筷子才可以就餐,如果每个哲学家先拿起左边的筷子,哪每个哲学家就需要等待其他哲学家释放筷子,造成死锁。
更多Java学习资料可关注:gzitcast获取
点赞
收藏
分享
文章举报
码农的世界,你不懂
发布了782 篇原创文章
·
获赞 3
·
访问量 11万+
私信
关注
猜你喜欢
转载自
blog.csdn.net/u010395024/article/details/104959863
java多线程并发全面解析
Java并发-多线程面试(全面)
Java多线程并发全面总结
linux多线程全面解析
java并发与多线程
java多线程并发
Java多线程与并发
Java并发多线程
iOS开发全面解析多线程
Java多线程解析
Java并发与多线程(1):多线程
多线程-最全面的介绍java并发编程中遇到的各种锁
java多线程——并发测试
Java并发 多线程的代价
Java多线程-并发容器
Java 多线程 并发编程
Java多线程之并发
java并发基础--多线程
java多线程和并发
Java多线程并发协同
Java多线程与并发(二)
Java多线程与并发(一)
Java多线程与并发(三)
java多线程高并发
java多线程并发机制
java多线程并发原理
java多线程并发图谱
java并发和多线程
Java多线程并发探索
java面试:多线程与并发
今日推荐
NetBSD 禁止提交由 AI 生成的代码
Apache Doris 2.0.10 版本正式发布!
开源日报 | 大模型开战;大模型独角兽被曝卖身;周鸿祎建议谷歌开源所有产品;最大开源AI社区提供1000万美元共享GPU
开源日报 | Chrome内置Gemini的意义不在于Gemini;中国AI追随之路的五大误区;ECharts创始人“下海”养鱼;谷歌I/O开发者大会什么都有,只是没有惊喜
微软回应中国区AI团队“打包赴美”传闻
基于大语言模型的开源知识库问答系统 MaxKB GitHub Star 数量突破 5,000 个!
周排行
static方法和非static方法的区别(java)
如何查找计算机专业paper
java.lang.ClassFormatError: Incompatible magic value 0 in class file com/sitecha
跳跃游戏II
stm32_之【建立工程】
TeaWeb v0.0.9 发布,统计底层优化、主机监控功能改进
事件分发 -----控制字体大小
JavaScript DOM练习(动态表格添加) December 25,2019
JSF Scope & CDI
实现从零搭建一个登录注册页面(附源代码)
每日归档
更多
2024-05-19(0)
2024-05-18(4)
2024-05-17(34)
2024-05-16(6)
2024-05-15(24)
2024-05-14(0)
2024-05-13(18)
2024-05-12(0)
2024-05-11(38)
2024-05-10(38)