多线程相关概念
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了多线程相关概念,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4023字,纯文字阅读大概需要6分钟。
内容图文
![多线程相关概念](/upload/InfoBanner/zyjiaocheng/1037/23d8aca14599466d9baa172f3a43e033.jpg)
synchronized实现原理
多线程
线程是程序中一个单一的顺序控制流程;而多线程就是在单个程序中同时运行多个线程来完成不同的工作。多线程同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。多线程是在同一时间需要完成多项任务的时候实现的。
优点:
1、多线程技术可以加快程序的运行速度,使程序的响应速度更快,因为用户界面可以在进行其他工作的同时一直处于活动状态
2、可以把占据长时间的程序中的任务放在后台去处理,同时执行其他操作,提高效率
3、当前没有进行处理的任务时可以将处理器时间让给其他任务
4、可以让同一程序的不同部分并发执行,释放一些珍贵的资源如内存占用等
5、可以随时停止任务
6、可以分别设置各个任务的优先级来优化性能
缺点:
1)、因为多线程需要开辟内存,而且线程切换需要时间因此会很消耗系统内存。
2)、线程的终止会对程序产生影响
3)、由于多个线程之间存在共享数据,因此容易出现线程死锁的情况
4)、对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。
线程的几种实现方式?
1、通过继承Thread类实现一个线程(继承扩展性不强,Java只支持单继承,一个类继承了Thread就不能继承其他类)
2、通过实现Runable接口实现一个线程(
线程怎么启动?
Thread thread = new Thread(传入继承了Thread的对象或实现了Runnable接口的对象);
thread.setName(“设置一个线程名称”);
thread.start();
启动线程使用start方法,而启动了以后执行的是run方法。
怎么区分线程?在一个系统中有许多线程,每个线程都会打印日志,如何区分日志是哪个线程打印的?
设置一个线程名:thread.setName();这是一种规范,在创建线程完成后都需要设置名称。
java.util.current包中提供了对线程优化,管理的各项操作,使得线程的使用变的得心应手,包中提供了线程的运行,线程池的创建,线程生命周期的控制。
Java通过Executors提供四个静态方法创建四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空线程,若无可回收,则创建线程。
newFixedThreadPool创建一个定长线程池,可控制线程最大开发数,超过的线程会在队列中等待。
newScheduledThreadPool创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行
什么是上下文切换?
多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。
概括来说就是:当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换回这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。
上下文切换通常是计算密集型的。也就是说,它需要相当可观的处理器时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间。所以,上下文切换对系统来说意味着消耗大量的 CPU 时间,事实上,可能是操作系统中时间消耗最大的操作
如何避免线程死锁?
我们只要破坏产生死锁的四个条件中的其中一个就可以了。
破坏互斥条件
这个条件我们没有办法破坏,因为我们用锁本来就是想让他们互斥的(临界资源需要互斥访问)。
破坏请求与保持条件
一次性申请所有的资源。
破坏不剥夺条件
占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
破坏循环等待条件
靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。
线程池的作用?
1、限定线程的个数,不会由于线程过多而导致系统运行缓慢或崩溃
2、线程池不需要每次都去创建或销毁,节约了资源,响应时间更快
为什么我们调用 start() 方法时会执行 run() 方法,而不是直接调用 run() 方法?
new 一个 Thread,线程进入了新建状态;调用 start() 方法,会启动一个线程并使线程进入了就绪状态,当分配到时间片后就可以开始运行了。 start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的多线程工作。 而直接执行 run() 方法,会把 run 方法当成一个 main 线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。
synchronized
synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。
synchronized的可重入性
一个线程调用synchronized方法的同时在其方法体内部调用该对象另一个synchronized方法,也就是说一个线程得到一个对象锁后再次请求该对象锁,是允许的,这就是synchronized的可重入性
内容总结
以上是互联网集市为您收集整理的多线程相关概念全部内容,希望文章能够帮你解决多线程相关概念所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。