摘要:
参考文章: [1]创建线程池 http://sunnylocus.iteye.com/blog/223327?page=2#comments [2]线程组ThreadGroup http://hubingforever.blog.163.com/blog/static/1710405792010913191791/一、为什么要用线程池: 1)减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务 2)可以根据系统的承受能力,调整线程池中工作线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)二、Thre 阅读全文
2013年7月23日 #
摘要:
此例子用来演示 ThreadGroup 的一些作用/** 02* Simple demo of ThreadGroup usage.03*/04public class ThreadGroupDemo {0506class MyThreadGroup extends ThreadGroup {07public void uncaughtException(Thread t, Throwable ex) {08System.err.println("I caught " + ex);09}10public MyThreadGroup(String name) {11super 阅读全文
摘要:
在Java中每个线程都属于某个线程组(ThreadGroup)。例如,如果在main()中产生一个线程,则这个线程属于main线程组管理的一员,您可以使用下面的指令来获得目前线程所属的线程组名称:Thread.currentThread().getThreadGroup().getName();每一个线程产生时,都会被归入某个线程组,视线程是在哪个线程组中产生而定。如果没有指定,则归入产生该子线程的线程组中。您也可以自行指定线程组,线程一旦归入某个组,就无法更换组。java.lang.ThreadGroup类正如其名,可以统一管理整个线程组中的线程,您可以使用以下方式来产生线程组,而且一并指定 阅读全文
摘要:
目录:[ - ]State独占模式和共享模式Java 5 中的诸如 ReentrantLock、Semaphore、FutureTask 等并发类都应用了前一篇所提到的 CAS。但是它们也都不是直接使用 CAS,而是通过 AbstractQueuedSynchronizer 来实现的。虽然 Java 5 中的并发类对于绝大多数的场景来说已经够用了,但是了解 AQS 对于理解这些并发类的实现原理是不无益处的,而且还可以使你在已有的并发类无法满足需要的时候可以有机会一显身手。State在 AQS 中有一个 int 类型的 volatile 变量 state,使用 AQS 的类可以自定义 state 阅读全文
摘要:
目录:[ - ]Compare and SwapCompare and SetJDK 5 的并发包中提供了很多类,这些类提供了比原有的并发机制更好的性能和伸缩性。要想理解这些类的工作机理,那就不得不提到 CAS。CAS 全称是 Compare and Swap,是指现代主流 CPU 都支持的一种指令,这个指令能为多线程编程带来更好的性能(稍后会详细介绍)。另外一个可能会被当做 CAS 的是 Compare and Set,是指 JDK 5 并发包中广泛使用的一种基于 Compare and Swap 的并发算法。严格说 CAS 仅指代前者。Compare and Swap在这里,CAS 指的是 阅读全文
摘要:
锁的劣势 Java在JDK1.5之前都是靠synchronized关键字保证同步的,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程 持有守护变量的锁,都采用独占的方式来访问这些变量,如果出现多个线程同时访问锁,那第一些线线程将被挂起,当线程恢复执行时,必须等待其它线程执行完他 们的时间片以后才能被调度执行,在挂起和恢复执行过程中存在着很大的开销。锁还存在着其它一些缺点,当一个线程正在等待锁时,它不能做任何事。如果一个线 程在持有锁的情况下被延迟执行,那么所有需要这个锁的线程都无法执行下去。如果被阻塞的线程优先级高,而持有锁的线程优先级低,将会导致优先级反转 (Prior 阅读全文
摘要:
Java中使用synchronized关键字来加锁达到同步的目的,synchronized可以在作用在方法上,也可以作用在代码块上。Java中的每一个对象都可以作为锁,但是基本数量类型不行,如int、float。synchronized同步非静态方法 非静态同步方法,锁是当前对象实例,如下代码Info类中set()和get()方法都加上synchronized关键字同步,说明Info对象同一实例在同一时刻只能访问set()或get()方法:Java代码 publicclassInfo{privateStringcountry;privateStringcity;publicsynchron.. 阅读全文
摘要:
在Java中有两类线程:用户线程 (User Thread)、守护线程 (Daemon Thread)。所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因 此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。看Thread类中的setDaemon方法介绍:Java代码 publicfinalvoidsetDaemon(booleanon)将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java虚拟机 阅读全文
摘要:
Java编写的程序都运行在 Java 虚拟机 (JVM) 中,在 JVM 的内部,程序的多任务是通过多线程来实现的。每用 java 命令启动一个 java 应用程序,就会启动一个 JVM 进程。在同一个 JVM 进程中,有且只有一个进程,就是它自己。在这个 JVM 环境中,所有程序代码的运行都是以线程来运行。 对于一个进程中的多个线程来说,多个线程共享进程的内存块,当有新的线程产生的时候,操作系统不分配新的内存,而是让新线程共享原有的进程块的内存。因此,线程间的通信 很容易,速度也很快。不同的进程因为处于不同的内存块,因此进程之间的通信相对困难。实现多线程的两种方式 一种是继承 Thr... 阅读全文
摘要:
Java IO之File类JavaIO中所有的操作类跟接口都放在 java.io 包中,主要的类和接口有 File 、 InputStream 、 OutputStream 、 Reader 、 Writer 、 Serialzable 接口。 1、 File类 File类在整个 IO 中是独立的类,此类的主要功能是与平台无关的文件操作,如创建文件、删除文件等,在 File 类中提供了 publicFile(Stringpathname) ,在使用的时候需要指定一个具体的文件路径。2、创建文件 Java代码 packagecom.chenzehe.test.io;importjava.io.. 阅读全文
摘要:
这是有一次去面试被问到的,当时只知道用synchronized来保证同步,但面试官说除了此方式的其它实现,现在写下它的各种实现:1、JDK1.5之前的内置锁synchronized实现模仿JDK1.5之前同步集合SynchronizedList的实现,内部使用synchronized对一个对一个List的封装,如下代码:Java代码 /***@description**@authorchenzehe*@emailhljuczh@163.com*@create2013-2-22下午05:03:43*/publicclassSyncListimplementsList{finalObjectmut 阅读全文
摘要:
1、队列Queue介绍Queue是JDK1.5引入的接口,继承Collection接口,是Collection框架的新成员,是种先进先出(FIFO)的队列。Java代码 publicinterfaceQueueextendsCollection{booleanadd(Ee);booleanoffer(Ee);Eremove();Epoll();Eelement();Epeek();}除了基本的Collection操作外,队列还提供其他的插入、提取和检查操作。每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或 false,具体取决于操作)。抛出异常返回特殊值插 阅读全文
摘要:
1、Java在JDK1.5之前基本上对所有集合都实现了线程同步版本synchronized*,用集合工具类Collections即可得到,如下都为Collections中的方法:Java代码 staticCollectionsynchronizedCollection(Collectionc)返回指定collection支持的同步(线程安全的)collection。staticListsynchronizedList(Listlist)返回指定列表支持的同步(线程安全的)列表。staticMapsynchronizedMap(Mapm)返回由指定映射支持的同步(线程安全的)映射。staticS 阅读全文
摘要:
ConcurrentHashMap是JDK1.5并发包中提供的线程安全的HashMap的实现,其包结构关系如下:Java代码 publicclassConcurrentHashMapextendsAbstractMapimplementsConcurrentMap,Serializable{}publicabstractclassAbstractMapimplementsMap{}publicinterfaceConcurrentMapextendsMap{}ConcurrentHashMap实现并发是通过“锁分离”技术来实现的,也就是将锁拆分,不同的元素拥有不同的 锁,ConcurrentH 阅读全文
摘要:
1、ArrayListArrayList是List接口最常见的实现,其实现是基于数组的方式实现,无容量的限制,ArrayList是非线程安全的。如下代码为ArrayList的构造函数,当没有确定的容量大小时,默认长度为10:Java代码 privatetransientObject[]elementData;publicArrayList(intinitialCapacity){super();if(initialCapacitysize||indexoldCapacity){ObjectoldData[]=elementData;intnewCapacity=(oldCapacity*3)/ 阅读全文
摘要:
1、HashMapHashMap是Map接口最常见的实现,HashMap是非线程安全的,其内部实现是一种基于一个数组和链表的结合体,如下table为HashMap中存储数据的字段:Java代码 transientEntry[]table;Java代码 staticclassEntryimplementsMap.Entry{finalKkey;Vvalue;Entrynext;finalinthash;......} 上面的Entry就是数组中的元素,它持有一个指向下一个元素的引用,这就构成了链表。加载因子:final float loadFactor;默认加载因子:static final f 阅读全文
摘要:
集合是Java中是最常用的包,最常见的有Collection和Map两个接口的实现,Collection用于存放多个单对象,而Map用于存放Key-Value形式的键值对。 Collection中常见的又分两种常见类型的接口:List和Set,List支持存放重复的对象,而Set则不支持。List接口中常见的实现类 有:ArrayList、LinkedList、Vector、和Stack;Set接口常见的实现类有HashSet、TreeSet;Map常见的接 口有HashMap、TreeMap和HashTable,HashMap和HashTable的主区别是HashMap是非线程安全的,而 H 阅读全文