接上篇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编程思想读书笔记(五)--多线程的更多相关文章

  1. JAVA编程思想读书笔记(四)--对象的克隆

    接上篇JAVA编程思想读书笔记(三)--RTTI No1: 类的克隆 public class MyObject implements Cloneable { int i; public MyObje ...

  2. JAVA编程思想读书笔记(三)--RTTI

    接上篇JAVA编程思想读书笔记(二) 第十一章 运行期类型判定 No1: 对于作为程序一部分的每个类,它们都有一个Class对象.换言之,每次写一个新类时,同时也会创建一个Class对象(更恰当的说, ...

  3. JAVA编程思想读书笔记(二)--容器

    接上篇JAVA编程思想读书笔记(一) 第八章.对象的容纳 No1: java提供了四种类型的集合类:Vector(矢量).BitSet(位集).Stack(堆栈).Hashtable(散列表) No2 ...

  4. Java编程思想读书笔记之内部类

    现在是够懒得了,放假的时候就想把这篇笔记写出来,一直拖到现在,最近在读<Java编程思想>,我想会做不止这一篇笔记,因为之前面试的时候总会问道一些内部类的问题,那这本书的笔记就从内部类开始 ...

  5. Java编程思想读书笔记(一)【对象导论】

    2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...

  6. Java编程思想读书笔记(二)【一切都是对象】

    begin 2018年1月9日17:06:47 第二章 一切都是对象 Java语言假设我们只进行面向对象的程序设计. 2.1 用引用操纵对象 每种编程语言都有自己的操纵内存元素的方式 操纵内存元素的方 ...

  7. <Java编程思想>读书笔记(1)-对象导论、一切都是对象

    1.面向对象编程:OOP (Object-oriented Programming) 2.Alan Kay 总结的面向对象语言5个基本特性: 1) 万物皆为对象 2) 程序是对象的集合,他们通过发送消 ...

  8. Java编程思想读书笔记

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. Java编程思想读书笔记--第14章类型信息

    7.动态代理 代理是基本的设计模式之一,它是你为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象.这些操作通常涉及与“实际”对象的通信,因此代理通常充当着中间人的角色. 什么是代理模式? ...

随机推荐

  1. P3620 [APIO/CTSC 2007]数据备份

    P3620 [APIO/CTSC 2007]数据备份 题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同 ...

  2. JAX-WS搭建WebService和客户端访问程序

    开发环境:myeclipse8.6+jdk1.6.0_29+tomcat6.0.37 XFire搭建webservice: http://www.cnblogs.com/gavinYang/p/352 ...

  3. centos7 mysql5.7.17源码安装

    **安装前准备 操作系统环境:Centos 7.2 1.解决依赖包并下载源码包至/home/soft/目录下 1 2 3 4 5 6 7 [root@node03 ~]# yum -y install ...

  4. 【VSCode】Windows下VSCode编译调试c/c++【更新 2018.03.27】

    --------– 2018.03.27 更新--------- 便携版已更新,点此获取便携版 已知BUG:中文目录无法正常调试 用于cpptools 0.15.0插件的配置文件更新 新的launch ...

  5. 树链剖分处理+线段树解决问题 HDU 5029

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5029 题意:n个点的树,m次操作.每次操作输入L,R,V,表示在[L,R]这个区间加上V这个数字.比 ...

  6. Amcharts 柱状图和线形图

    最近需要学习 Amcharts ,他的图表功能确实很强大.但是网上搜索到的教程很少,开始学起的确有点不方便.于是我决定把我学习的觉得好的途径,放到博客上. 下面的代码可以直接复制,但是文件要从官网上下 ...

  7. iOS静态库 ---iOS-Apple苹果官方文档翻译

    iOS静态库 ---iOS-Apple苹果官方文档翻译 •什么是库? 库是共享程序代码的方式,一般分为静态库和动态库.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使⽤用就为什 ...

  8. HDU 1081 To The Max (dp)

    题目链接 Problem Description Given a two-dimensional array of positive and negative integers, a sub-rect ...

  9. JS日历控件特效代码layDate

    https://www.js-css.cn/a/jscode/date/2015/0405/1461.html

  10. linux网络配置完全解析

    概述:熟悉了windows下面的网络配置,对linux下的网络配置缺未必了解透彻.熟练掌握linux下的网络配置原理,能帮助我们更容易掌握网络传输原理:同时具备一些网络连接不通对应问题的排查能力.文本 ...