java多线程
文章平均质量分 57
chengshiep
这个作者很懒,什么都没留下…
展开
-
Java多线程(二)——线程中断interrupt
当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。这里需要注意的是,如果只是单纯的调用interrupt()方法,线程并没有实际被中断,会继续往下执行。如下代码所示,线程中断了,仍继续执行public class MyThreadDemo extends Thread{ public原创 2016-03-01 15:13:21 · 493 阅读 · 0 评论 -
线程的状态分析
线程状态通过查看Thread源码,可以看到里面定义了枚举类State,如下:public enum State { /** * 线程创建之后,但是还没有启动(not yet started)。这时候它的状态就是NEW */ NEW, /** * 正在Java虚拟机下跑任务的线程的状态。在RUNNABL转载 2017-09-08 11:20:24 · 500 阅读 · 0 评论 -
ThreadLocal
简介Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量。使用public static final ThreadLocal holder = new ThreadLocal(); holder.set(“test”); // 存 ho原创 2016-05-24 17:40:53 · 489 阅读 · 0 评论 -
Java多线程之concurrent包(三)——Executor框架与线程池
Executor框架简介在Java 5之后,并发编程引入了一堆新的启动、调度和管理线程的API。Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用原创 2016-03-03 12:13:38 · 619 阅读 · 0 评论 -
this逃逸问题
当内部类代码执行的时候,外部类对象的创建过程很有可能还没结束,这个时候如果内部类访问外部类中的数据,很有可能得到还没有正确初始化的数据。public class ThreadThisEscape { private int weight = 0; public ThreadThisEscape() { new Thread(new EscapeRunnable()原创 2017-01-16 11:03:58 · 619 阅读 · 0 评论 -
Java多线程(八)——死锁
线程A当前持有互斥所锁lock1,线程B当前持有互斥锁lock2。接下来,当线程A仍然持有lock1时,它试图获取lock2,因为线程B正持有lock2,因此线程A会阻塞等待线程B对lock2的释放。如果此时线程B在持有lock2的时候,也在试图获取lock1,因为线程A正持有lock1,因此线程B会阻塞等待A对lock1的释放。二者都在等待对方所持有锁的释放,而二者却又都没释放自己所持有的锁,这时原创 2016-03-02 10:31:37 · 395 阅读 · 0 评论 -
Java多线程之concurrent包(一)——ReentrantLock与Condition
什么是reentrantlockReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和内存语义,但是添加了类似锁投票、定时锁等候和可中断锁等候的一些特性。此外,它还提供了在激烈争用情况下更佳的性能。(换句话说,当许多线程都想访问共享资源时,JVM 可以花更少的时候来调度线程,把更多时间用在执行线程上。)它有一个与锁相关的获取计数器,如果拥有锁的某个线程再原创 2016-03-03 10:37:17 · 643 阅读 · 0 评论 -
Java多线程(六)——Synchronized关键字
在并发编程中,多线程同时并发访问的资源叫做临界资源,当多个线程同时访问对象并要求操作相同资源时,分割了原子操作就有可能出现数据的不一致或数据不完整的情况,为避免这种情况的发生,我们会采取同步机制,以确保在某一时刻,方法内只允许有一个线程。采用synchronized修饰符实现的同步机制叫做互斥锁机制,它所获得的锁叫做互斥锁。每个对象都有一个monitor(锁标记),当线程拥有这个锁标记时才能访问这个原创 2016-03-01 17:28:10 · 353 阅读 · 0 评论 -
Java多线程之concurrent包(六)——CountDownLatch
CountDownLatch是减计数方式,计数==0时释放所有等待的线程;CountDownLatch当计数到0时,计数无法被重置;CountDownLatch每次调用countDown()方法计数减一,调用await()方法只进行阻塞,对计数没任何影响;示例代码:public class TestCountDownLatch { private static final int N = 1原创 2016-03-03 14:51:41 · 453 阅读 · 0 评论 -
Java多线程之concurrent包(五)——CyclicBarrier
CyclicBarrier当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续。 后续线程进入,则计数器重新计数,一直循环。CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。 CyclicBarrier初始时还可带一个Runnable的参数, 此Runnable任务在CyclicBarrier的数目达原创 2016-03-03 14:41:40 · 374 阅读 · 0 评论 -
Java多线程之concurrent包(四)——Semaphore信号量
Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。public class SemaphoreDemo { public s原创 2016-03-03 14:26:45 · 1267 阅读 · 0 评论 -
Java多线程之concurrent包(二)——线程安全集合
Collection框架线程安全集合Collection 框架是一种表示对象集合的高度灵活的框架,它使用基本接口 List、Set 和 Map。通过 JDK 提供每个集合的多次实现(HashMap、Hashtable、TreeMap、WeakHashMap、HashSet、TreeSet、Vector、ArrayList、LinkedList 等等)。其中一些集合已经是线程安全的(Hashtable原创 2016-03-03 11:43:49 · 591 阅读 · 0 评论 -
Java多线程(九)——wait() notify() notifyAll()
在Java中,可以通过配合调用Object对象的wait()方法和notify()方法或notifyAll()方法来实现线程间的通信。在线程中调用wait()方法,将阻塞等待其他线程的通知(其他线程调用notify()方法或notifyAll()方法),在线程中调用notify()方法或notifyAll()方法,将通知其他线程从wait()方法处返回。Object是所有类的超类,它有5个方法组成了原创 2016-03-02 11:25:12 · 482 阅读 · 0 评论 -
Java多线程(一)——线程创建的两种方法
Java中实现多线程有两种方法:继承Thread类、实现Runnable接口 在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下优势:1、可以避免由于Java的单继承特性而带来的局限;2、增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的;3、适合多个相同程序代码的线程区处理同一资源的情况。下面以典型的买票程序(基原创 2016-03-01 14:29:39 · 505 阅读 · 0 评论 -
Java多线程(七)——Collections.synchronizedXX包装器
在Collections类 中有多个静态方法,它们可以获取通过同步方法封装非同步集合而得到的集合:public static Collection synchronizedCollention(Collection c)public static List synchronizedList(list l)public static Map synchronizedMap(Map m)public s原创 2016-03-01 17:47:20 · 474 阅读 · 1 评论 -
Java多线程(五)——Volatile关键字
转自:http://www.ibm.com/developerworks/cn/java/j-jtp06197.htmlJava 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。本文介绍了几种有效转载 2016-03-01 17:03:12 · 389 阅读 · 0 评论 -
Java多线程(四)——线程阻塞四种情况与守护线程
线程阻塞四种状态1、当线程执行Thread.sleep()时,它一直阻塞到指定的毫秒时间之后,或者阻塞被另一个线程打断;2、当线程碰到一条wait()语句时,它会一直阻塞到接到通知(notify())、被中断或经过了指定毫秒时间为止(若制定了超时值的话)3、线程阻塞与不同I/O的方式有多种。常见的一种方式是InputStream的read()方法,该方法一直阻塞到从流中读取一个字节的数据为止,它可以原创 2016-03-01 16:19:44 · 3110 阅读 · 0 评论 -
Java多线程(三)——线程挂起、恢复、终止
挂起和恢复线程suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此 时,其他任何线程都不能访问锁定的资源,除非被”挂起”的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就 会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指原创 2016-03-01 15:57:09 · 559 阅读 · 0 评论 -
java多线程通信方法
进程间通信的方法主要有以下几种(1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。(2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关 系 进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。(3)信号(Signa原创 2017-09-08 16:06:50 · 446 阅读 · 0 评论