java 多线程以及线程池
1.多线程可以使程序反应更快,交互性更强,执行效率最高。
2.创建一个线程: 要实现Runnable 接口,创建Thread类的对象,用start开始执行线程。
3.使用Thread中的yield()方法为其他线程临时让出CPU时间。
4.sleep()方法可以将线程设置为休眠状态以确保其他线程执行。休眠时间为毫秒数·。
sleep()方法可能抛出一个InterruptedException.这是一个必捡异常。需要try-catch块中。
yield()方法为其他线程临时让出CPU时间。
· join()方法使一个线程等待另一个线程的结束。
5.start()方法使启动一个线程。
run()方法是线程启动后要进行回调的方法。
sleep执行后线程进入阻塞状态,不考虑线程优先级
yield执行后线程进入就绪状态,只会给相同优先级或者更高优先级线程运行机会。
join执行后线程进入阻塞状态
sleep() 后线程不释放锁,跟此线程 共享所的 线程 都被阻塞,但不影响其他线程运行。固定时间后,等待CPU调度。
await() 后线程释放锁,所有线程都有机会执行。并且等待 其他线程 通过signal()方法唤醒。
await() 和 signal()是成对出现的。是Thread 类的方法。
wait() 和 notify() 是成对出现的。是object类的方法。
线程的sleep()方法和yield()方法有什么区别?
答:
① sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;
② 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;
③ sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;
④ sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。
5.java为每个线程都设置一个优先级。默认情况下,线程继承他的线程的优先级。可以用setPriorty方法提高或者降低优先级。还可以用getPriorty方法获取优先级。
优先级是1-10的数字。MIN_PRIORITY,NORM_PRIORITY,MAX_PRIORITY,分别代表1,5,10.
主线程的优先级是Thread.NORM_PRIORITY。
如果,线程的优先级相同,那么将会用循环队列给他们分配相同的CPU份额。被称为 循环调度。
6.Thread中还包含 stop(),suspend(),resume()。方法,但是存在不安全因素。不提倡使用这些方法。
使用线程池的好处
1.通过重复利用已创建的线程, 减少在创建和销毁线程上所花的时间以及系统资源的开销。
2.提高响应速度。 当任务到达时, 任务可以不需要等到线程创建就可以立即行。
3.提高线程的可管理性。 使用线程池可以对线程进行统一的分配和监控。
4.如果不使用线程池, 有可能造成系统创建大量线程而导致消耗完系统内存。
线程池的注意事项
虽然线程池是构建多线程应用程序的强大机制, 但使用它并不是没有风险的。
(1) 线程池的大小。 多线程应用并非线程越多越好, 需要根据系统运行的软硬件环境以及应用本身的特点决定线程池的大小。 一般来说, 如果代码结构合理的话, 线程数目与 CPU数量相适合即可。 如果线程运行时可能出现阻塞现象, 可相应增加池的大小; 如有必要可采用自适应算法来动态调整线程池的大小, 以提高 CPU 的有效利用率和系统的整体性能。
(2) 并发错误。 多线程应用要特别注意并发错误, 要从逻辑上保证程序的正确性, 注意避免死锁现象的发生。
(3) 线程泄漏。 这是线程池应用中一个严重的问题, 当任务执行完毕而线程没能返回池中就会发生线程泄漏现象。
线程的基本状态以及状态之间的关系?
说明:其中Running表示运行状态,Runnable表示就绪状态(万事俱备,只欠CPU),
Blocked表示阻塞状态,阻塞状态又有多种情况,可能是因为调用wait()方法进入等待池,也可能是执行同步方法或同步代码块进入等锁池,或者是调用了sleep()方法或join()方法等待休眠或其他线程结束,或是因为发生了I/O中断。
synchronized 和 lock 区别:
Synchronized 是 Java的关键字,采用Synchonized关键字实现同步时,如果多个线程只是进行 读操作,当一个线程进行读操作时,其他线程不能执行读操作。
Lock 是 一个类,Lock.lock()方法创建锁。在对 lock()的调用后紧随一个try-catch块并且在finally子句中释放这个锁。【lock.unlock()】
使用Synchronized时不需要 手动的去释放锁,当Synchronized方法或者代码块执行结束后,系统会自动让线程释放锁;而lock则需要用户手动去释放锁,如果没有释放锁,则会导致死锁现象。
java 多线程以及线程池的更多相关文章
- Java多线程与线程池技术
一.序言 Java多线程编程线程池被广泛使用,甚至成为了标配. 线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批 ...
- Java 多线程:线程池
Java 多线程:线程池 作者:Grey 原文地址: 博客园:Java 多线程:线程池 CSDN:Java 多线程:线程池 工作原理 线程池内部是通过队列结合线程实现的,当我们利用线程池执行任务时: ...
- java多线程、线程池及Spring配置线程池详解
1.java中为什么要使用多线程使用多线程,可以把一些大任务分解成多个小任务来执行,多个小任务之间互不影像,同时进行,这样,充分利用了cpu资源.2.java中简单的实现多线程的方式 继承Thread ...
- Java多线程和线程池
转自:http://blog.csdn.net/u013142781/article/details/51387749 1.为什么要使用线程池 在Java中,如果每个请求到达就创建一个新线程,开销是相 ...
- Java多线程之线程池详解
前言 在认识线程池之前,我们需要使用线程就去创建一个线程,但是我们会发现有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因 ...
- JAVA多线程(三) 线程池和锁的深度化
github演示代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-servic ...
- Java多线程-ThreadPool线程池(三)
开完一趟车完整的过程是启动.行驶和停车,但老司机都知道,真正费油的不是行驶,而是长时间的怠速.频繁地踩刹车等动作.因为在速度切换的过程中,发送机要多做一些工作,当然就要多费一些油. 而一个Java线程 ...
- java 多线程 4 线程池
系统启动一个新线程的成本是比较高的,因为它涉及到与操作系统的交互.在这种情况下,使用线程池可以很好的提供性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 与数据库连接池类似 ...
- Java多线程之线程池
现在是多核的时代,面向多核的编程很重要,因此基于java的并发和多线程开发非常重要. 线程池是于队列密切相关的,其中队列保存了所有等待执行的任务.工作者线程的任务很简单:从队列中获取一个任务,执行任务 ...
- Java多线程(四) 线程池
一个优秀的软件不会随意的创建.销毁线程,因为创建和销毁线程需要耗费大量的CPU时间以及需要和内存做出大量的交互.因此JDK5提出了使用线程池,让程序员把更多的精力放在业务逻辑上面,弱化对线程的开闭管理 ...
随机推荐
- js进阶 13-1 jquery动画中的显示隐藏函数有哪些
js进阶 13-1 jquery动画中的显示隐藏函数有哪些 一.总结 一句话总结:show(),hide(),toggle(),这三个. 1.jquery动画中显示隐藏效果函数有哪些? show()h ...
- LA 3135 - Argus
看题:传送门 大意就是让你编写一个称为argus的系统,这个系统支持一个register的命令: Register Q_num Period 该命令注册了一个触发器,它每Period秒就会残生一个编 ...
- 10.5 android输入系统_Reader线程_使用EventHub读取事件和核心类及配置文件_实验_分析
4. Reader线程_使用EventHub读取事件 使用inotify监测/dev/input下文件的创建和删除 使用epoll监测有无数据上报 细节: a.fd1 = inotify_init(& ...
- cocos2d-x 3.0 android mk文件 之 自己主动遍历*.cpp文件
还记得上一篇android mk 文件的写法吗?传送门, 我们须要手动去加入 cpp文件.假设cpp一多,那不是要累死? LOCAL_PATH := $(call my-dir) include $( ...
- 小小ARC造福无数码农
今天无意中看到非常久之前的一个项目,古老的语法规范,还有更让人战战兢兢"内存管理代码"! 在这不得不说OC中内存管理的三种分类: Mannul Reference Counting ...
- stm32的APB1和APB2时钟
要学会看官方例子,还要查找官方程序...
- Python——管理属性(2)
__getattr__和__getattribute__ 眼下已经介绍了特性property和描写叙述符来管理特定属性[參考这里],而__getattr__和__getattribute__操作符重载 ...
- 从Lua调用C
从Lua调用C: 方式:C函数从栈中获取函数參数(第一个參数总是局部栈的索引1),将结果压入栈中,C函数须要返回结果数量. 每一个函数都有自己的局部私有栈 样例: static int l_sin(l ...
- Struts2完全解耦和
jsp: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnco ...
- 【54.38%】【BZOJ 4300】绝世好题
Time Limit: 1 Sec Memory Limit: 128 MB Submit: 1120 Solved: 609 [Submit][Status][Discuss] Descript ...