- 浏览: 7251024 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
转载自 http://www.iteye.com/topic/970055
上周五和周末,工作忙里偷闲,在看java cocurrent中也顺便再温故了一下Thread.interrupt和java 5之后的LockSupport的实现。
在介绍之前,先抛几个问题。
- Thread.interrupt()方法和InterruptedException异常的关系?是由interrupt触发产生了InterruptedException异常?
- Thread.interrupt()会中断线程什么状态的工作? RUNNING or BLOCKING?
- 一般Thread编程需要关注interrupt中断不?一般怎么处理?可以用来做什么?
- LockSupport.park()和unpark(),与object.wait()和notify()的区别?
- LockSupport.park(Object blocker)传递的blocker对象做什么用?
- LockSupport能响应Thread.interrupt()事件不?会抛出InterruptedException异常?
- Thread.interrupt()处理是否有对应的回调函数?类似于钩子调用?
- public void interrupt() : 执行线程interrupt事件
- public boolean isInterrupted() : 检查当前线程是否处于interrupt
- public static boolean interrupted() : check当前线程是否处于interrupt,并重置interrupt信息。类似于resetAndGet()
- 遇到一个低优先级的block状态时,比如object.wait(),object.sleep(),object.join()。它会立马触发一个unblock解除阻塞,并throw一个InterruptedException。
- 其他情况,Thread.interrupt()仅仅只是更新了status标志位。然后你的工作线程通过Thread.isInterrrupted()进行检查,可以做相应的处理,比如也throw InterruptedException或者是清理状态,取消task等。
- Don't swallow interrupts (别吃掉Interrupt,一般是两种处理: 继续throw InterruptedException异常。 另一种就是继续设置Thread.interupt()异常标志位,让更上一层去进行相应处理。
- public class TaskRunner implements Runnable {
- private BlockingQueue<Task> queue;
- public TaskRunner(BlockingQueue<Task> queue) {
- this.queue = queue;
- }
- public void run() {
- try {
- while (true) {
- Task task = queue.take(10, TimeUnit.SECONDS);
- task.execute();
- }
- }
- catch (InterruptedException e) {
- // Restore the interrupted status
- Thread.currentThread().interrupt();
- }
- }
- }
public class TaskRunner implements Runnable { private BlockingQueue<Task> queue; public TaskRunner(BlockingQueue<Task> queue) { this.queue = queue; } public void run() { try { while (true) { Task task = queue.take(10, TimeUnit.SECONDS); task.execute(); } } catch (InterruptedException e) { // Restore the interrupted status Thread.currentThread().interrupt(); } } }
- Implementing cancelable tasks with Interrupt (使用Thread.interrupt()来设计和支持可被cancel的task)
- public class PrimeProducer extends Thread {
- private final BlockingQueue<BigInteger> queue;
- PrimeProducer(BlockingQueue<BigInteger> queue) {
- this.queue = queue;
- }
- public void run() {
- try {
- BigInteger p = BigInteger.ONE;
- while (!Thread.currentThread().isInterrupted())
- queue.put(p = p.nextProbablePrime());
- } catch (InterruptedException consumed) {
- /* Allow thread to exit */
- }
- }
- public void cancel() { interrupt(); } // 发起中断
- }<SPAN style="WHITE-SPACE: normal"> </SPAN>
public class PrimeProducer extends Thread { private final BlockingQueue<BigInteger> queue; PrimeProducer(BlockingQueue<BigInteger> queue) { this.queue = queue; } public void run() { try { BigInteger p = BigInteger.ONE; while (!Thread.currentThread().isInterrupted()) queue.put(p = p.nextProbablePrime()); } catch (InterruptedException consumed) { /* Allow thread to exit */ } } public void cancel() { interrupt(); } // 发起中断 }
注册Interrupt处理事件(非正常用法)
一般正常的task设计用来处理cancel,都是采用主动轮询的方式检查Thread.isInterrupt(),对业务本身存在一定的嵌入性,还有就是存在延迟,你得等到下一个检查点(谁知道下一个检查点是在什么时候,特别是进行一个socket.read时,遇到过一个HttpClient超时的问题)。
来看一下,主动抛出InterruptedException异常的实现,借鉴于InterruptibleChannel的设计,比较取巧。
- interface InterruptAble { // 定义可中断的接口
- public void interrupt() throws InterruptedException;
- }
- abstract class InterruptSupport implements InterruptAble {
- private volatile boolean interrupted = false;
- private Interruptible interruptor = new Interruptible() {
- public void interrupt() {
- interrupted = true;
- InterruptSupport.this.interrupt(); // 位置3
- }
- };
- public final boolean execute() throws InterruptedException {
- try {
- blockedOn(interruptor); // 位置1
- if (Thread.currentThread().isInterrupted()) { // 立马被interrupted
- interruptor.interrupt();
- }
- // 执行业务代码
- bussiness();
- } finally {
- blockedOn(null); // 位置2
- }
- return interrupted;
- }
- public abstract void bussiness() ;
- public abstract void interrupt();
- // -- sun.misc.SharedSecrets --
- static void blockedOn(Interruptible intr) { // package-private
- sun.misc.SharedSecrets.getJavaLangAccess().blockedOn(Thread.currentThread(), intr);
- }
- }
interface InterruptAble { // 定义可中断的接口 public void interrupt() throws InterruptedException; } abstract class InterruptSupport implements InterruptAble { private volatile boolean interrupted = false; private Interruptible interruptor = new Interruptible() { public void interrupt() { interrupted = true; InterruptSupport.this.interrupt(); // 位置3 } }; public final boolean execute() throws InterruptedException { try { blockedOn(interruptor); // 位置1 if (Thread.currentThread().isInterrupted()) { // 立马被interrupted interruptor.interrupt(); } // 执行业务代码 bussiness(); } finally { blockedOn(null); // 位置2 } return interrupted; } public abstract void bussiness() ; public abstract void interrupt(); // -- sun.misc.SharedSecrets -- static void blockedOn(Interruptible intr) { // package-private sun.misc.SharedSecrets.getJavaLangAccess().blockedOn(Thread.currentThread(), intr); } }
代码说明,几个取巧的点:
位置1:利用sun提供的blockedOn方法,绑定对应的Interruptible事件处理钩子到指定的Thread上。
位置2:执行完代码后,清空钩子。避免使用连接池时,对下一个Thread处理事件的影响。
位置3:定义了Interruptible事件钩子的处理方法,回调InterruptSupport.this.interrupt()方法,子类可以集成实现自己的业务逻辑,比如sock流关闭等等。
使用:
- class InterruptRead extends InterruptSupport {
- private FileInputStream in;
- @Override
- public void bussiness() {
- File file = new File("/dev/urandom"); // 读取linux黑洞,永远读不完
- try {
- in = new FileInputStream(file);
- byte[] bytes = new byte[1024];
- while (in.read(bytes, 0, 1024) > 0) {
- // Thread.sleep(100);
- // if (Thread.interrupted()) {// 以前的Interrupt检查方式
- // throw new InterruptedException("");
- // }
- }
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- public FileInputStream getIn() {
- return in;
- }
- @Override
- public void interrupt() {
- try {
- in.getChannel().close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- public static void main(String args[]) throws Exception {
- final InterruptRead test = new InterruptRead();
- Thread t = new Thread() {
- @Override
- public void run() {
- long start = System.currentTimeMillis();
- try {
- System.out.println("InterruptRead start!");
- test.execute();
- } catch (InterruptedException e) {
- System.out.println("InterruptRead end! cost time : " + (System.currentTimeMillis() - start));
- e.printStackTrace();
- }
- }
- };
- t.start();
- // 先让Read执行3秒
- Thread.sleep(3000);
- // 发出interrupt中断
- t.interrupt();
- }
class InterruptRead extends InterruptSupport { private FileInputStream in; @Override public void bussiness() { File file = new File("/dev/urandom"); // 读取linux黑洞,永远读不完 try { in = new FileInputStream(file); byte[] bytes = new byte[1024]; while (in.read(bytes, 0, 1024) > 0) { // Thread.sleep(100); // if (Thread.interrupted()) {// 以前的Interrupt检查方式 // throw new InterruptedException(""); // } } } catch (Exception e) { throw new RuntimeException(e); } } public FileInputStream getIn() { return in; } @Override public void interrupt() { try { in.getChannel().close(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String args[]) throws Exception { final InterruptRead test = new InterruptRead(); Thread t = new Thread() { @Override public void run() { long start = System.currentTimeMillis(); try { System.out.println("InterruptRead start!"); test.execute(); } catch (InterruptedException e) { System.out.println("InterruptRead end! cost time : " + (System.currentTimeMillis() - start)); e.printStackTrace(); } } }; t.start(); // 先让Read执行3秒 Thread.sleep(3000); // 发出interrupt中断 t.interrupt(); }
jdk源码介绍:
1. sun提供的钩子可以查看System的相关代码, line : 1125
- sun.misc.SharedSecrets.setJavaLangAccess(new sun.misc.JavaLangAccess(){
- public sun.reflect.ConstantPool getConstantPool(Class klass) {
- return klass.getConstantPool();
- }
- public void setAnnotationType(Class klass, AnnotationType type) {
- klass.setAnnotationType(type);
- }
- public AnnotationType getAnnotationType(Class klass) {
- return klass.getAnnotationType();
- }
- public <E extends Enum<E>>
- E[] getEnumConstantsShared(Class<E> klass) {
- return klass.getEnumConstantsShared();
- }
- public void blockedOn(Thread t, Interruptible b) {
- t.blockedOn(b);
- }
- });
sun.misc.SharedSecrets.setJavaLangAccess(new sun.misc.JavaLangAccess(){ public sun.reflect.ConstantPool getConstantPool(Class klass) { return klass.getConstantPool(); } public void setAnnotationType(Class klass, AnnotationType type) { klass.setAnnotationType(type); } public AnnotationType getAnnotationType(Class klass) { return klass.getAnnotationType(); } public <E extends Enum<E>> E[] getEnumConstantsShared(Class<E> klass) { return klass.getEnumConstantsShared(); } public void blockedOn(Thread t, Interruptible b) { t.blockedOn(b); } });
2. Thread.interrupt()
- public void interrupt() {
- if (this != Thread.currentThread())
- checkAccess();
- synchronized (blockerLock) {
- Interruptible b = blocker;
- if (b != null) {
- interrupt0(); // Just to set the interrupt flag
- b.interrupt(); //回调钩子
- return;
- }
- }
- interrupt0();
- }
public void interrupt() { if (this != Thread.currentThread()) checkAccess(); synchronized (blockerLock) { Interruptible b = blocker; if (b != null) { interrupt0(); // Just to set the interrupt flag b.interrupt(); //回调钩子 return; } } interrupt0(); }
更多
更多关于Thread.stop,suspend,resume,interrupt的使用注意点,可以看一下sun的文档,比如http://download.oracle.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html
最后来解答一下之前的几个问题:
问题1: Thread.interrupt()方法和InterruptedException异常的关系?是由interrupt触发产生了InterruptedException异常?
答: Thread.interrupt()只是在Object.wait() .Object.join(), Object.sleep()几个方法会主动抛出InterruptedException异常。而在其他的的block常见,只是通过设置了Thread的一个标志位信息,需要程序自我进行处理。
if (Thread.interrupted()) // Clears interrupted status! throw new InterruptedException();
问题2:Thread.interrupt()会中断线程什么状态的工作? RUNNING or BLOCKING?
答:Thread.interrupt设计的目的主要是用于处理线程处于block状态,比如wait(),sleep()状态就是个例子。但可以在程序设计时为支持task cancel,同样可以支持RUNNING状态。比如Object.join()和一些支持interrupt的一些nio channel设计。
问题3: 一般Thread编程需要关注interrupt中断不?一般怎么处理?可以用来做什么?
答: interrupt用途: unBlock操作,支持任务cancel, 数据清理等。
问题4: LockSupport.park()和unpark(),与object.wait()和notify()的区别?
答:
1. 面向的主体不一样。LockSuport主要是针对Thread进进行阻塞处理,可以指定阻塞队列的目标对象,每次可以指定具体的线程唤醒。Object.wait()是以对象为纬度,阻塞当前的线程和唤醒单个(随机)或者所有线程。
2. 实现机制不同。虽然LockSuport可以指定monitor的object对象,但和object.wait(),两者的阻塞队列并不交叉。可以看下测试例子。object.notifyAll()不能唤醒LockSupport的阻塞Thread.
问题5: LockSupport.park(Object blocker)传递的blocker对象做什么用?
答: 对应的blcoker会记录在Thread的一个parkBlocker属性中,通过jstack命令可以非常方便的监控具体的阻塞对象.
- public static void park(Object blocker) {
- Thread t = Thread.currentThread();
- setBlocker(t, blocker); // 设置Thread.parkBlocker属性的值
- unsafe.park(false, 0L);
- setBlocker(t, null); // 清除Thread.parkBlocker属性的值
- }
public static void park(Object blocker) { Thread t = Thread.currentThread(); setBlocker(t, blocker); // 设置Thread.parkBlocker属性的值 unsafe.park(false, 0L); setBlocker(t, null); // 清除Thread.parkBlocker属性的值 }
具体LockSupport的javadoc描述也比较清楚,可以看下:
问题6: LockSupport能响应Thread.interrupt()事件不?会抛出InterruptedException异常?
答:能响应interrupt事件,但不会抛出InterruptedException异常。针对LockSupport对Thread.interrupte支持,也先看一下javadoc中的描述:
相关测试代码
- package com.agapple.cocurrent;
- import java.io.File;
- import java.io.FileInputStream;
- import java.lang.reflect.Field;
- import java.util.concurrent.TimeUnit;
- import java.util.concurrent.locks.LockSupport;
- public class LockSupportTest {
- private static LockSupportTest blocker = new LockSupportTest();
- public static void main(String args[]) throws Exception {
- lockSupportTest();
- parkTest();
- interruptParkTest();
- interruptSleepTest();
- interruptWaitTest();
- }
- /**
- * LockSupport.park对象后,尝试获取Thread.blocker对象,调用其single唤醒
- *
- * @throws Exception
- */
- private static void lockSupportTest() throws Exception {
- Thread t = doTest(new TestCallBack() {
- @Override
- public void callback() throws Exception {
- // 尝试sleep 5s
- System.out.println("blocker");
- LockSupport.park(blocker);
- System.out.println("wakeup now!");
- }
- @Override
- public String getName() {
- return "lockSupportTest";
- }
- });
- t.start(); // 启动读取线程
- Thread.sleep(150);
- synchronized (blocker) {
- Field field = Thread.class.getDeclaredField("parkBlocker");
- field.setAccessible(true);
- Object fBlocker = field.get(t);
- System.out.println(blocker == fBlocker);
- Thread.sleep(100);
- System.out.println("notifyAll");
- blocker.notifyAll();
- }
- }
- /**
- * 尝试去中断一个object.wait(),会抛出对应的InterruptedException异常
- *
- * @throws InterruptedException
- */
- private static void interruptWaitTest() throws InterruptedException {
- final Object obj = new Object();
- Thread t = doTest(new TestCallBack() {
- @Override
- public void callback() throws Exception {
- // 尝试sleep 5s
- obj.wait();
- System.out.println("wakeup now!");
- }
- @Override
- public String getName() {
- return "interruptWaitTest";
- }
- });
- t.start(); // 启动读取线程
- Thread.sleep(2000);
- t.interrupt(); // 检查下在park时,是否响应中断
- }
- /**
- * 尝试去中断一个Thread.sleep(),会抛出对应的InterruptedException异常
- *
- * @throws InterruptedException
- */
- private static void interruptSleepTest() throws InterruptedException {
- Thread t = doTest(new TestCallBack() {
- @Override
- public void callback() throws Exception {
- // 尝试sleep 5s
- Thread.sleep(5000);
- System.out.println("wakeup now!");
- }
- @Override
- public String getName() {
- return "interruptSleepTest";
- }
- });
- t.start(); // 启动读取线程
- Thread.sleep(2000);
- t.interrupt(); // 检查下在park时,是否响应中断
- }
- /**
- * 尝试去中断一个LockSupport.park(),会有响应但不会抛出InterruptedException异常
- *
- * @throws InterruptedException
- */
- private static void interruptParkTest() throws InterruptedException {
- Thread t = doTest(new TestCallBack() {
- @Override
- public void callback() {
- // 尝试去park 自己线程
- LockSupport.parkNanos(blocker, TimeUnit.SECONDS.toNanos(5));
- System.out.println("wakeup now!");
- }
- @Override
- public String getName() {
- return "interruptParkTest";
- }
- });
- t.start(); // 启动读取线程
- Thread.sleep(2000);
- t.interrupt(); // 检查下在park时,是否响应中断
- }
- /**
- * 尝试去中断一个LockSupport.unPark(),会有响应
- *
- * @throws InterruptedException
- */
- private static void parkTest() throws InterruptedException {
- Thread t = doTest(new TestCallBack() {
- @Override
- public void callback() {
- // 尝试去park 自己线程
- LockSupport.park(blocker);
- System.out.println("wakeup now!");
- }
- @Override
- public String getName() {
- return "parkTest";
- }
- });
- t.start(); // 启动读取线程
- Thread.sleep(2000);
- LockSupport.unpark(t);
- t.interrupt();
- }
- public static Thread doTest(final TestCallBack call) {
- return new Thread() {
- @Override
- public void run() {
- File file = new File("/dev/urandom"); // 读取linux黑洞
- try {
- FileInputStream in = new FileInputStream(file);
- byte[] bytes = new byte[1024];
- while (in.read(bytes, 0, 1024) > 0) {
- if (Thread.interrupted()) {
- throw new InterruptedException("");
- }
- System.out.println(bytes[0]);
- Thread.sleep(100);
- long start = System.currentTimeMillis();
- call.callback();
- System.out.println(call.getName() + " callback finish cost : "
- + (System.currentTimeMillis() - start));
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- };
- }
- }
- interface TestCallBack {
- public void callback() throws Exception;
- public String getName();
- }
package com.agapple.cocurrent; import java.io.File; import java.io.FileInputStream; import java.lang.reflect.Field; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.LockSupport; public class LockSupportTest { private static LockSupportTest blocker = new LockSupportTest(); public static void main(String args[]) throws Exception { lockSupportTest(); parkTest(); interruptParkTest(); interruptSleepTest(); interruptWaitTest(); } /** * LockSupport.park对象后,尝试获取Thread.blocker对象,调用其single唤醒 * * @throws Exception */ private static void lockSupportTest() throws Exception { Thread t = doTest(new TestCallBack() { @Override public void callback() throws Exception { // 尝试sleep 5s System.out.println("blocker"); LockSupport.park(blocker); System.out.println("wakeup now!"); } @Override public String getName() { return "lockSupportTest"; } }); t.start(); // 启动读取线程 Thread.sleep(150); synchronized (blocker) { Field field = Thread.class.getDeclaredField("parkBlocker"); field.setAccessible(true); Object fBlocker = field.get(t); System.out.println(blocker == fBlocker); Thread.sleep(100); System.out.println("notifyAll"); blocker.notifyAll(); } } /** * 尝试去中断一个object.wait(),会抛出对应的InterruptedException异常 * * @throws InterruptedException */ private static void interruptWaitTest() throws InterruptedException { final Object obj = new Object(); Thread t = doTest(new TestCallBack() { @Override public void callback() throws Exception { // 尝试sleep 5s obj.wait(); System.out.println("wakeup now!"); } @Override public String getName() { return "interruptWaitTest"; } }); t.start(); // 启动读取线程 Thread.sleep(2000); t.interrupt(); // 检查下在park时,是否响应中断 } /** * 尝试去中断一个Thread.sleep(),会抛出对应的InterruptedException异常 * * @throws InterruptedException */ private static void interruptSleepTest() throws InterruptedException { Thread t = doTest(new TestCallBack() { @Override public void callback() throws Exception { // 尝试sleep 5s Thread.sleep(5000); System.out.println("wakeup now!"); } @Override public String getName() { return "interruptSleepTest"; } }); t.start(); // 启动读取线程 Thread.sleep(2000); t.interrupt(); // 检查下在park时,是否响应中断 } /** * 尝试去中断一个LockSupport.park(),会有响应但不会抛出InterruptedException异常 * * @throws InterruptedException */ private static void interruptParkTest() throws InterruptedException { Thread t = doTest(new TestCallBack() { @Override public void callback() { // 尝试去park 自己线程 LockSupport.parkNanos(blocker, TimeUnit.SECONDS.toNanos(5)); System.out.println("wakeup now!"); } @Override public String getName() { return "interruptParkTest"; } }); t.start(); // 启动读取线程 Thread.sleep(2000); t.interrupt(); // 检查下在park时,是否响应中断 } /** * 尝试去中断一个LockSupport.unPark(),会有响应 * * @throws InterruptedException */ private static void parkTest() throws InterruptedException { Thread t = doTest(new TestCallBack() { @Override public void callback() { // 尝试去park 自己线程 LockSupport.park(blocker); System.out.println("wakeup now!"); } @Override public String getName() { return "parkTest"; } }); t.start(); // 启动读取线程 Thread.sleep(2000); LockSupport.unpark(t); t.interrupt(); } public static Thread doTest(final TestCallBack call) { return new Thread() { @Override public void run() { File file = new File("/dev/urandom"); // 读取linux黑洞 try { FileInputStream in = new FileInputStream(file); byte[] bytes = new byte[1024]; while (in.read(bytes, 0, 1024) > 0) { if (Thread.interrupted()) { throw new InterruptedException(""); } System.out.println(bytes[0]); Thread.sleep(100); long start = System.currentTimeMillis(); call.callback(); System.out.println(call.getName() + " callback finish cost : " + (System.currentTimeMillis() - start)); } } catch (Exception e) { e.printStackTrace(); } } }; } } interface TestCallBack { public void callback() throws Exception; public String getName(); }
最后
发觉文章越写越长,那就索性发到了论坛,大家一起讨论下.毕竟文章中描述的都是一些使用层面的东东,并没有从操作系统或者sun native实现上去介绍Thread的一些机制,熟悉这块的大牛门也可以出来发表下高见.
本文仅当抛砖引玉,欢迎发言!
发表评论
-
Mule ESB 学习笔记(20)Mule和Spring httpinvoker的整合
2013-08-28 13:59 3662mule的配置文件: <?xml version=& ... -
Mule ESB 学习笔记(19)Mule和RSS的整合
2013-08-28 10:08 2516定时扫描特定目录的rss文件: <?xml vers ... -
Mule ESB 学习笔记(18)Mule和ATOM的整合
2013-08-27 20:00 2528定时读取特定文件的rss文件: <?xml ... -
Mule ESB 学习笔记(17)Mule和JMX的整合
2013-08-27 16:48 3975Agent的实现: package com.easyway ... -
Mule ESB 学习笔记(16)CXF SOAP基于SAML的验证的配置
2013-08-27 15:19 3716mule的配置 <mule xmlns:core=& ... -
Mule ESB 学习笔记(15)CXF SOAP基于JKS的验证的配置
2013-08-27 14:57 3763mule的配置如下: <mule xmlns:cor ... -
Mule ESB 学习笔记(14)CXF SOAP基于UsernameToken的验证
2013-08-27 14:16 7869简单需求: 针对在webservice ... -
Mule ESB 学习笔记(13)CSV数据文件到数据库
2013-08-26 17:54 6954简单需求: ... -
Mule ESB 学习笔记(12)JSON转换器的使用
2013-08-26 13:54 8960在许多情况下,可能需要把类转换为js ... -
Mule ESB 学习笔记(11)Web Service Proxy
2013-08-24 19:32 6514一、WebSevice Proxy 简介 ... -
Mule ESB 学习笔记(10)mule事务配置
2013-08-23 16:36 6106在mule的事务可能为jdbc事务,jms事务 ... -
Mule ESB 学习笔记(9)mule配置常用节点解释
2013-08-23 13:27 33231 Mule-config.x ... -
Mule ESB 学习笔记(8)mule和jersey的整合使用
2013-08-23 11:20 3858在项目常用jesery作为rest ... -
Mule ESB 学习笔记(7)服务调用
2013-08-23 10:44 18804一. 服务调用 1. Mule实现并提供Web Servi ... -
Mule ESB 学习笔记(6)配置模式
2013-08-23 10:42 4669为了节省时间,就不翻译了,摘抄重点总结 ... -
Mule ESB 学习笔记(5)异步请求-响应方式
2013-08-22 15:32 34875.4 异步请求-响应方式 异步请求-响应方式即请求方调用 ... -
Mule ESB 学习笔记(4)同步方式
2013-08-22 15:19 41185.3 同步方式 同步方式即请求方调用 ... -
JBOSS EJB3项目启动执行一个任务
2013-08-06 22:26 3722在jboss的项目中,jboss启动 ... -
Jboss @Service的使用
2013-08-06 21:59 1900Jboss有一个扩展的annotation——@Servic ... -
julian Date 计算 和实现
2013-08-01 09:32 4325Qt库里CBSDate类的内部实现用_jd成员进行计算、比较 ...
相关推荐
本文将详细介绍java线程阻塞中断和LockSupport的使用,需要了解更多的朋友可以参考下
LockSupport类提供了park()和unpark()两个方法来实现线程的阻塞和唤醒,下面我们就来详解Java多线程编程中LockSupport类的线程阻塞用法:
LockSupport是JDK1.6中在java.util.concurrent中的子包locks中引入的一个比较底层的工具类,用来创建锁和其他同步工具类的基本线程阻塞原语。java锁和同步器框架的核心 AQS: AbstractQueuedSynchronizer,就是通过...
在Java多线程中,当需要阻塞或者唤醒一个线程时,都会使用LockSupport工具类来完成相应的工作。LockSupport定义了一组公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能,而LockSupport也因此成为了构建同步...
Java 多线程与并发(9_26)-JUC锁_ LockSupport详解
LockSupport.xmid总结,用于知识巩固,
1.3并发问题的根源 1.4JMM 1.5线程安全的分类 1.6线程安全的方法 二、线程基础 2.1状态 2.2使用方式 2.3基础机制 2.4中断 2.5互斥同步 2.6线程合作 三、Synchronized 详解 3.1 使用 3.2 原理分析 3.3 ...
主要给大家介绍了关于Java并发编程学习之Unsafe类与LockSupport类源码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
主要为大家详细介绍了Java concurrency之LockSupport的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...
描述一下Java线程的生命周期,线程状态; 线程之间的通信方式; 描述一下notify和notifyAll区别; synchronized关键字加在静态方法和实例方法的区别; 用锁的注意点; cas机制可能导致的问题ABA,什么是ABA; 程序开...
(4)start和run:不能直接调用run方法,因为这样并不会启动一个新的线程,依旧是在main线程来执行。相当于普通方法的直接调用 2.常见方法: (1)Sleep:写的位置决定作用于哪个线程,其他线程可以通过interrupt来打断...
而那些等待执行的线程全部处于阻塞状态,经过调查线程的显式阻塞是通过调用 LockSupport.park() 完成,而 LockSupport.park() 则调用 sun.misc.Unsafe.park()本地方法,再进一步,HotSpot 在 Linux 中中通过调用 ...
Java并发包源码分析(JDK1.8):囊括了java.util.concurrent包中大部分类的源码分析,其中涉及automic包,locks包(AbstractQueuedSynchronizer、ReentrantLock、ReentrantReadWriteLock、LockSupport等),queue...
测试LockSupport,LockSupport基于一个“许可”的概念实现了线程的阻塞与释放,该测试demo就是为了使这个“许可”的概念更加的清晰
HSDIS查看Java代码的汇编指令 java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssemble 使用 LockSupport.park()and unpark() public static void main(String[] args) { char[] aI = 1234567.toCharArray(); ...
LockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习...
java7 hashmap源码 to-be-architect to be a Java architect,you should learn these.This page is updated irregularly. Java基础 深入分析 Java SPI 机制和原理 并发编程专题 Executors线程池 线程池...
阻塞队列 COEN 283 的阻塞队列项目 通过阻塞队列传递消息 使用同步的消息缓冲区使用队列来实现阻塞队列,并在队列为空/满时进行自旋等待。 无锁消息缓冲区创建环形缓冲区;...线程观察者监控线程生产者和消费者的效率