JAVA编程思想读书笔记(五)--多线程
No1:
daemon Thread(守护线程)
参考http://blog.csdn.net/pony_maggie/article/details/42441895
daemon是相于user线程而言的,可以理解为一种运行在后台的服务线程,比如时钟处理线程、idle线程、垃圾回收线程等都是daemon线程。
daemon线程有个特点就是"比较次要",程序中如果所有的user线程都结束了,那这个程序本身就结束了,不管daemon是否结束。而user线程就不是这样,只要还有一个user线程存在,程序就不会退出。
哪些情况要用到它呢?举个例子,比如垃圾回收线程,我们希望用户线程存在时,它也存在,但当所有的用户线程退出时,程序就要退出,垃圾回收线程不要影响退出。如果定义成了用户线程,那么只要垃圾回收线程不退出,用户线程就不会退出,与实际需求不相符。
public class Daemon extends Thread {
private static final int SIZE = 10;
private Thread[] t = new Thread[SIZE];
public Daemon() {
setDaemon(true);
start();
}
@Override
public void run() {
for (int i = 0; i < SIZE; i++) {
t[i] = new DaemonSpawn(i);
}
for (int i = 0; i < SIZE; i++) {
System.out.println("t[" + i + "].isDaemon()=" + t[i].isDaemon());
}
while (true) {
yield();
}
}
}
public class DaemonSpawn extends Thread {
public DaemonSpawn(int i) {
System.out.println("DaemonSpwan " + i + " started");
start();
}
@Override
public void run() {
while (true) {
yield();
}
}
}
public class Daemons {
public static void main(String args[]) {
Thread d = new Daemon();
System.out.println("d.isDaemon()= " + d.isDaemon());
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Waiting for CR");
try {
stdin.readLine();
} catch (IOException e) {
}
}
}
打印结果
d.isDaemon()= true
Waiting for CR
DaemonSpwan 0 started
DaemonSpwan 1 started
DaemonSpwan 2 started
DaemonSpwan 3 started
DaemonSpwan 4 started
DaemonSpwan 5 started
DaemonSpwan 6 started
DaemonSpwan 7 started
DaemonSpwan 8 started
DaemonSpwan 9 started
t[0].isDaemon()=true
t[1].isDaemon()=true
t[2].isDaemon()=true
t[3].isDaemon()=true
t[4].isDaemon()=true
t[5].isDaemon()=true
t[6].isDaemon()=true
t[7].isDaemon()=true
t[8].isDaemon()=true
t[9].isDaemon()=true
No2:
线程组和线程池的区别?(ThreadGroup / ThreadPool)
线程组:线程组存在的意义,首要原因是安全。java默认创建的线程都是属于系统线程组,而同一个线程组的线程是可以相互修改对方的数据的。但如果在不同的线程组中,那么就不能“跨线程组”修改数据,可以从一定程度上保证数据安全。
线程池:线程池存在的意义,首要作用是效率。线程的创建和结束都需要耗费一定的系统时间(特别是创建),不停创建和删除线程会浪费大量的时间。所以,在创建出一条线程并使其在执行完任务后不结束,而是使其进入休眠状态,在需要用时再唤醒,那么 就可以节省一定的时间。如果这样的线程比较多,那么就可以使用线程池来进行管理。保证效率。
线程组和线程池共有的特点:1,都是管理一定数量的线程2,都可以对线程进行控制---包括休眠,唤醒,结束,创建,中断(暂停)--但并不一定包含全部这些操作。
No3:
线程堵塞的原因:
(1)调用sleep(毫秒数),使线程进入”睡眠“状态。在规定的时间内,这个线程是不会运行的
(2)用suspend()暂停了线程的执行。除非线程收到resume()消息,否则不会返回“可运行”状态(这两个方法都不建议使用了,因为不安全)
(3)用wait()暂停了线程的执行,除非线程收到notify()或者notifyAll()消息,否则不会变成“可运行”
(4)线程正在等待一些IO(输入输出)操作完成
(5)线程试图调用另一个对象的“同步”方法,但那个对象处于锁定状态,暂时无法使用
No4:
多线程的弊端?
1)降低了一个进程里面的线程的执行频率
2)对线程进行管理要求额外的CPU开销。线程的使用会给系统带来上下文切换的额外负担
3)公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,发生线程安全问题
4)线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状
JAVA编程思想读书笔记(五)--多线程的更多相关文章
- JAVA编程思想读书笔记(四)--对象的克隆
接上篇JAVA编程思想读书笔记(三)--RTTI No1: 类的克隆 public class MyObject implements Cloneable { int i; public MyObje ...
- JAVA编程思想读书笔记(三)--RTTI
接上篇JAVA编程思想读书笔记(二) 第十一章 运行期类型判定 No1: 对于作为程序一部分的每个类,它们都有一个Class对象.换言之,每次写一个新类时,同时也会创建一个Class对象(更恰当的说, ...
- JAVA编程思想读书笔记(二)--容器
接上篇JAVA编程思想读书笔记(一) 第八章.对象的容纳 No1: java提供了四种类型的集合类:Vector(矢量).BitSet(位集).Stack(堆栈).Hashtable(散列表) No2 ...
- Java编程思想读书笔记之内部类
现在是够懒得了,放假的时候就想把这篇笔记写出来,一直拖到现在,最近在读<Java编程思想>,我想会做不止这一篇笔记,因为之前面试的时候总会问道一些内部类的问题,那这本书的笔记就从内部类开始 ...
- Java编程思想读书笔记(一)【对象导论】
2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...
- Java编程思想读书笔记(二)【一切都是对象】
begin 2018年1月9日17:06:47 第二章 一切都是对象 Java语言假设我们只进行面向对象的程序设计. 2.1 用引用操纵对象 每种编程语言都有自己的操纵内存元素的方式 操纵内存元素的方 ...
- <Java编程思想>读书笔记(1)-对象导论、一切都是对象
1.面向对象编程:OOP (Object-oriented Programming) 2.Alan Kay 总结的面向对象语言5个基本特性: 1) 万物皆为对象 2) 程序是对象的集合,他们通过发送消 ...
- Java编程思想读书笔记
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Java编程思想读书笔记--第14章类型信息
7.动态代理 代理是基本的设计模式之一,它是你为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象.这些操作通常涉及与“实际”对象的通信,因此代理通常充当着中间人的角色. 什么是代理模式? ...
随机推荐
- 二叉树系列 - 二叉树的深度,例 [LeetCode]
二叉树的深度的概念最值得注意的地方,在于 到"叶子"节点的距离. 一般来说,如果直接说“深度”,都是指最大深度,即最远叶子的距离. 这里放两道例题,最小深度和最大深度. 1. 二叉 ...
- 2017北京国庆刷题Day6 morning
期望得分:100+100+20=220 实际得分:100+100+20=220 模拟栈 #include<cstdio> #include<cstring> using nam ...
- [Luogu 1197] JSOI2008 星球大战
[Luogu 1197] JSOI2008 星球大战 我算是真的沦为联赛选手了. 并查集裸题. 比较麻烦的是删点. 但是从后往前加点就好操作很多. 所以考虑离线,先存图,然后没被删的点之间,有边就合并 ...
- Linux高级编程--02.gcc和动态库
在Linux环境下,我们通常用gcc将C代码编译成可执行文件,如下就是一个简单的例子: 小实验:hello.c #include <stdlib.h> #include <stdio ...
- python 操作PPT练习
from pptx import Presentation from pptx.util import Pt, Inches prs = Presentation() slide = prs.slid ...
- 基于HDP3.0的基础测试
1,TestDFSIO write和read的性能测试, 测试hadoop读写的速度.该测试为Hadoop自带的测试工具,位于$HADOOP_HOME/share/hadoop/mapreduce目录 ...
- 理解 CSS 中的伪元素 :before 和 :after
CSS 的主要目的是给 HTML 元素添加样式,然而,在一些案例中给文档添加额外的元素是多余的或是不可能的.事实上 CSS 中有一个特性允许我们添加额外元素而不扰乱文档本身,这就是“伪元素”. 你一定 ...
- ES6 中 Array.from() 不能得到的数组元素是 undefined 或是空数组
本文地址:http://www.cnblogs.com/veinyin/p/7944072.html 正确格式 let json = { '0': 'Waaaa~', '1': 'Hello,', ...
- 蓝色的企业后台cms管理系统——后台
链接:http://pan.baidu.com/s/1kViBtTt 密码:7hbk
- LCD常用接口原理【转】
转自:http://blog.csdn.net/wocao1226/article/details/23870149 LCD常用接口原理 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打 ...