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 多线程以及线程池的更多相关文章

  1. Java多线程与线程池技术

    一.序言 Java多线程编程线程池被广泛使用,甚至成为了标配. 线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批 ...

  2. Java 多线程:线程池

    Java 多线程:线程池 作者:Grey 原文地址: 博客园:Java 多线程:线程池 CSDN:Java 多线程:线程池 工作原理 线程池内部是通过队列结合线程实现的,当我们利用线程池执行任务时: ...

  3. java多线程、线程池及Spring配置线程池详解

    1.java中为什么要使用多线程使用多线程,可以把一些大任务分解成多个小任务来执行,多个小任务之间互不影像,同时进行,这样,充分利用了cpu资源.2.java中简单的实现多线程的方式 继承Thread ...

  4. Java多线程和线程池

    转自:http://blog.csdn.net/u013142781/article/details/51387749 1.为什么要使用线程池 在Java中,如果每个请求到达就创建一个新线程,开销是相 ...

  5. Java多线程之线程池详解

    前言 在认识线程池之前,我们需要使用线程就去创建一个线程,但是我们会发现有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因 ...

  6. JAVA多线程(三) 线程池和锁的深度化

    github演示代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-servic ...

  7. Java多线程-ThreadPool线程池(三)

    开完一趟车完整的过程是启动.行驶和停车,但老司机都知道,真正费油的不是行驶,而是长时间的怠速.频繁地踩刹车等动作.因为在速度切换的过程中,发送机要多做一些工作,当然就要多费一些油. 而一个Java线程 ...

  8. java 多线程 4 线程池

    系统启动一个新线程的成本是比较高的,因为它涉及到与操作系统的交互.在这种情况下,使用线程池可以很好的提供性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 与数据库连接池类似 ...

  9. Java多线程之线程池

    现在是多核的时代,面向多核的编程很重要,因此基于java的并发和多线程开发非常重要. 线程池是于队列密切相关的,其中队列保存了所有等待执行的任务.工作者线程的任务很简单:从队列中获取一个任务,执行任务 ...

  10. Java多线程(四) 线程池

    一个优秀的软件不会随意的创建.销毁线程,因为创建和销毁线程需要耗费大量的CPU时间以及需要和内存做出大量的交互.因此JDK5提出了使用线程池,让程序员把更多的精力放在业务逻辑上面,弱化对线程的开闭管理 ...

随机推荐

  1. 实现span设置宽度(行内元素本来不支持调宽度高度这些样式)(变成行内块元素:display:inline-block;)

    实现span设置宽度(行内元素本来不支持调宽度高度这些样式)(变成行内块元素:display:inline-block;) 一.总结 1.将span从行内元素变成行内快元素就可以调了: 设置样式的时候 ...

  2. swiper如何实现轮播嵌套轮播

    之所以要写这篇文章是因为插件有个bug,要改掉这个bug比较麻烦,所以就想了个折中的办法,绕过这个限制,方法千万条,功能干出来第一条,哈哈 最近做了个需求,效果图是这样的 第一个框是大轮播,第二个框是 ...

  3. 实现indexOf

    1.先判断Array数组是否含有indexOf方法,如果有直接返回结果:如果没有则利用循环比较得到结果. function indexOf(arr, item) { if(Array.prototyp ...

  4. 1、Java快速入门

    第一课 Java基础1. ubuntu上环境搭建 (建议使用我们提供的VMWare映象文件) 如果要自己安装ubuntu, 请参考<韦东山Android系统视频使用手册.pdf> ubun ...

  5. 【习题 5-6 UVA-1595】Symmetry

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每一个y坐标的点都找中点. 看看中点是不是都一样就好. [代码] #include <bits/stdc++.h> us ...

  6. 怎样cp文件夹时忽略指定的文件夹和文件

    在备份ltedecoder程序时,须要把此文件夹拷由到bak文件夹下.但decoder文件夹下有个大文件,不须要备份,还有日志问题,也不须要备份,怎样实现呢?? 方法: cd /source-dir ...

  7. 【t086】防护伞

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 据说2012的灾难和太阳黑子的爆发有关.于是地球防卫小队决定制造一个特殊防护伞,挡住太阳黑子爆发的区域 ...

  8. 调试 之gdb thread命令 与 ltrace/strace

    我们可以通过  1)  gdb prog_name -> r               用在逐步调试自己的程序时 2)  gdb -> attach process_id       正 ...

  9. C++设计模式实现--备忘录(Memento)模式

    一. 备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态.并在该对象之外保存这个状态. 这样以后就可将该对象恢复到原先保存的状态. 结构图: 使用范围: Memento 模式比較适用于功 ...

  10. C语言实现字符串截取函数left、mid和right

    作者:iamlaosong C语言字符串截取须要自己编程实现,只是.网络时代,自然不用自己从头写了.网上各种方法的实现代码已经多如牛毛了,这儿抄录一个感觉不错的备案. #include <std ...