当前位置: 首页 > news >正文

广州网站建设 app 小程序百度广告投放价格

广州网站建设 app 小程序,百度广告投放价格,专业做蛋糕的网站,青岛网页设计公司报价单转自#xff1a; Thread的中断机制(interrupt)-这篇文章非常棒 Thread的中断机制(interrupt) - 寂静沙滩 - 博客园先看收集了别人的文章#xff0c;全面的了解下java的中断#xff1a;中断线程线程的thread.interrupt()方法是中断线程#xff0c;将会设置该线程的中断状态…转自 Thread的中断机制(interrupt)-这篇文章非常棒 Thread的中断机制(interrupt) - 寂静沙滩 - 博客园先看收集了别人的文章全面的了解下java的中断中断线程线程的thread.interrupt()方法是中断线程将会设置该线程的中断状态位即设置为true中断的结果线程是死亡、还是等待新的任务https://www.cnblogs.com/onlywujun/p/3565082.html 先看收集了别人的文章全面的了解下java的中断 中断线程 线程的thread.interrupt()方法是中断线程将会设置该线程的中断状态位即设置为true中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步就取决于这个程序本身。线程会不时地检测这个中断标示位以判断线程是否应该被中断中断标示值是否为true。它并不像stop方法那样会中断一个正在运行的线程。 判断线程是否被中断 判断某个线程是否已被发送过中断请求请使用Thread.currentThread().isInterrupted()方法因为它将线程中断标示位设置为true后不会立刻清除中断标示位即不会将中断标设置为false而不要使用thread.interrupted()该方法调用后会将中断标示位清除即重新设置为false方法来判断下面是线程在循环中时的中断方式 while(!Thread.currentThread().isInterrupted() more work to do){do more work } 如何中断线程 如果一个线程处于了阻塞状态如线程调用了thread.sleep、thread.join、thread.wait、1.5中的condition.await、以及可中断的通道上的 I/O 操作方法后可进入阻塞状态则在线程在检查中断标示时如果发现中断标示为true则会在这些阻塞方法sleep、join、wait、1.5中的condition.await及可中断的通道上的 I/O 操作方法调用处抛出InterruptedException异常并且在抛出异常后立即将线程的中断标示位清除即重新设置为false。抛出异常是为了线程从阻塞状态醒过来并在结束线程前让程序员有足够的时间来处理中断请求。 注synchronized在获锁的过程中是不能被中断的意思是说如果产生了死锁则不可能被中断请参考后面的测试例子。与synchronized功能相似的reentrantLock.lock()方法也是一样它也不可中断的即如果发生死锁那么reentrantLock.lock()方法无法终止如果调用时被阻塞则它一直阻塞到它获取到锁为止。但是如果调用带超时的tryLock方法reentrantLock.tryLock(long timeout, TimeUnit unit)那么如果线程在等待时被中断将抛出一个InterruptedException异常这是一个非常有用的特性因为它允许程序打破死锁。你也可以调用reentrantLock.lockInterruptibly()方法它就相当于一个超时设为无限的tryLock方法。 没有任何语言方面的需求一个被中断的线程应该终止。中断一个线程只是为了引起该线程的注意被中断线程可以决定如何应对中断。某些线程非常重要以至于它们应该不理会中断而是在处理完抛出的异常之后继续执行但是更普遍的情况是一个线程将把中断看作一个终止请求这种线程的run方法遵循如下形式 public void run() {try {.../** 不管循环里是否调用过线程阻塞的方法如sleep、join、wait这里还是需要加上* !Thread.currentThread().isInterrupted()条件虽然抛出异常后退出了循环显* 得用阻塞的情况下是多余的但如果调用了阻塞方法但没有阻塞时这样会更安全、更及时。*/while (!Thread.currentThread().isInterrupted() more work to do) {do more work }} catch (InterruptedException e) {//线程在wait或sleep期间被中断了} finally {//线程结束前做一些清理工作} } 上面是while循环在try块里如果try在while循环里时因该在catch块里重新设置一下中断标示因为抛出InterruptedException异常后中断标示位会自动清除此时应该这样 public void run() {while (!Thread.currentThread().isInterrupted() more work to do) {try {...sleep(delay);} catch (InterruptedException e) {Thread.currentThread().interrupt();//重新设置中断标示}} } 底层中断异常处理方式 另外不要在你的底层代码里捕获InterruptedException异常后不处理会处理不当如下 void mySubTask(){...try{sleep(delay);}catch(InterruptedException e){}//不要这样做... } 如果你不知道抛InterruptedException异常后如何处理那么你有如下好的建议处理方式 1、在catch子句中调用Thread.currentThread.interrupt()来设置中断状态因为抛出异常后中断标示会被清除让外界通过判断Thread.currentThread().isInterrupted()标示来决定是否终止线程还是继续下去应该这样做 void mySubTask() {...try {sleep(delay);} catch (InterruptedException e) {Thread.currentThread().isInterrupted();}... } 2、或者更好的做法就是不使用try来捕获这样的异常让方法直接抛出 void mySubTask() throws InterruptedException {...sleep(delay);... } 中断应用 使用中断信号量中断非阻塞状态的线程 中断线程最好的最受推荐的方式是使用共享变量shared variable发出信号告诉线程必须停止正在运行的任务。线程必须周期性的核查这一变量然后有秩序地中止任务。Example2描述了这一方式 class Example2 extends Thread {volatile boolean stop false;// 线程中断信号量public static void main(String args[]) throws Exception {Example2 thread new Example2();System.out.println(Starting thread...);thread.start();Thread.sleep(3000);System.out.println(Asking thread to stop...);// 设置中断信号量thread.stop true;Thread.sleep(3000);System.out.println(Stopping application...);}public void run() {// 每隔一秒检测一下中断信号量while (!stop) {System.out.println(Thread is running...);long time System.currentTimeMillis();/** 使用while循环模拟 sleep 方法这里不要使用sleep否则在阻塞时会 抛* InterruptedException异常而退出循环这样while检测stop条件就不会执行* 失去了意义。*/while ((System.currentTimeMillis() - time 1000)) {}}System.out.println(Thread exiting under request...);} } 使用thread.interrupt()中断非阻塞状态线程 虽然Example2该方法要求一些编码但并不难实现。同时它给予线程机会进行必要的清理工作。这里需注意一点的是需将共享变量定义成volatile 类型或将对它的一切访问封入同步的块/方法synchronized blocks/methods中。上面是中断一个非阻塞状态的线程的常见做法但对非检测isInterrupted()条件会更简洁: class Example2 extends Thread {public static void main(String args[]) throws Exception {Example2 thread new Example2();System.out.println(Starting thread...);thread.start();Thread.sleep(3000);System.out.println(Asking thread to stop...);// 发出中断请求thread.interrupt();Thread.sleep(3000);System.out.println(Stopping application...);}public void run() {// 每隔一秒检测是否设置了中断标示while (!Thread.currentThread().isInterrupted()) {System.out.println(Thread is running...);long time System.currentTimeMillis();// 使用while循环模拟 sleepwhile ((System.currentTimeMillis() - time 1000) ) {}}System.out.println(Thread exiting under request...);} } 到目前为止一切顺利但是当线程等待某些事件发生而被阻塞又会发生什么当然如果线程被阻塞它便不能核查共享变量也就不能停止。这在许多情况下会发生例如调用Object.wait()、ServerSocket.accept()和DatagramSocket.receive()时这里仅举出一些。 他们都可能永久的阻塞线程。即使发生超时在超时期满之前持续等待也是不可行和不适当的所以要使用某种机制使得线程更早地退出被阻塞的状态。下面就来看一下中断阻塞线程技术。 使用thread.interrupt()中断阻塞状态线程 Thread.interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是设置线程的中断标示位在线程受到阻塞的地方如调用sleep、wait、join等地方抛出一个异常InterruptedException并且中断状态也将被清除这样线程就得以退出阻塞的状态。下面是具体实现 class Example3 extends Thread {public static void main(String args[]) throws Exception {Example3 thread new Example3();System.out.println(Starting thread...);thread.start();Thread.sleep(3000);System.out.println(Asking thread to stop...);thread.interrupt();// 等中断信号量设置后再调用Thread.sleep(3000);System.out.println(Stopping application...);}public void run() {while (!Thread.currentThread().isInterrupted()) {System.out.println(Thread running...);try {/** 如果线程阻塞将不会去检查中断信号量stop变量所 以thread.interrupt()* 会使阻塞线程从阻塞的地方抛出异常让阻塞线程从阻塞状态逃离出来并* 进行异常块进行 相应的处理*/Thread.sleep(1000);// 线程阻塞如果线程收到中断操作信号将抛出异常} catch (InterruptedException e) {System.out.println(Thread interrupted...);/** 如果线程在调用 Object.wait()方法或者该类的 join() 、sleep()方法* 过程中受阻则其中断状态将被清除*/System.out.println(this.isInterrupted());// false//中不中断由自己决定如果需要真真中断线程则需要重新设置中断位如果//不需要则不用调用Thread.currentThread().interrupt();}}System.out.println(Thread exiting under request...);} } 一旦Example3中的Thread.interrupt()被调用线程便收到一个异常于是逃离了阻塞状态并确定应该停止。上面我们还可以使用共享信号量来替换!Thread.currentThread().isInterrupted()条件但不如它简洁。 死锁状态线程无法被中断 Example4试着去中断处于死锁状态的两个线程但这两个线都没有收到任何中断信号抛出异常所以interrupt()方法是不能中断死锁线程的因为锁定的位置根本无法抛出异常 class Example4 extends Thread {public static void main(String args[]) throws Exception {final Object lock1 new Object();final Object lock2 new Object();Thread thread1 new Thread() {public void run() {deathLock(lock1, lock2);}};Thread thread2 new Thread() {public void run() {// 注意这里在交换了一下位置deathLock(lock2, lock1);}};System.out.println(Starting thread...);thread1.start();thread2.start();Thread.sleep(3000);System.out.println(Interrupting thread...);thread1.interrupt();thread2.interrupt();Thread.sleep(3000);System.out.println(Stopping application...);}static void deathLock(Object lock1, Object lock2) {try {synchronized (lock1) {Thread.sleep(10);// 不会在这里死掉synchronized (lock2) {// 会锁在这里虽然阻塞了但不会抛异常System.out.println(Thread.currentThread());}}} catch (InterruptedException e) {e.printStackTrace();System.exit(1);}} } 中断I/O操作 然而如果线程在I/O操作进行时被阻塞又会如何I/O操作可以阻塞线程一段相当长的时间特别是牵扯到网络应用时。例如服务器可能需要等待一个请求request又或者一个网络应用程序可能要等待远端主机的响应。 实现此InterruptibleChannel接口的通道是可中断的如果某个线程在可中断通道上因调用某个阻塞的 I/O 操作常见的操作一般有这些serverSocketChannel. accept()、socketChannel.connect、socketChannel.open、socketChannel.read、socketChannel.write、fileChannel.read、fileChannel.write而进入阻塞状态而另一个线程又调用了该阻塞线程的 interrupt 方法这将导致该通道被关闭并且已阻塞线程接将会收到ClosedByInterruptException并且设置已阻塞线程的中断状态。另外如果已设置某个线程的中断状态并且它在通道上调用某个阻塞的 I/O 操作则该通道将关闭并且该线程立即接收到 ClosedByInterruptException并仍然设置其中断状态。如果情况是这样其代码的逻辑和第三个例子中的是一样的只是异常不同而已。 如果你正使用通道channels这是在Java 1.4中引入的新的I/O API那么被阻塞的线程将收到一个ClosedByInterruptException异常。但是你可能正使用Java1.0之前就存在的传统的I/O而且要求更多的工作。既然这样Thread.interrupt()将不起作用因为线程将不会退出被阻塞状态。Example5描述了这一行为。尽管interrupt()被调用线程也不会退出被阻塞状态比如ServerSocket的accept方法根本不抛出异常。 很幸运Java平台为这种情形提供了一项解决方案即调用阻塞该线程的套接字的close()方法。在这种情形下如果线程被I/O操作阻塞当调用该套接字的close方法时该线程在调用accept地方法将接收到一个SocketExceptionSocketException为IOException的子异常异常这与使用interrupt()方法引起一个InterruptedException异常被抛出非常相似注如果是流因读写阻塞后调用流的close方法也会被阻塞根本不能调用更不会抛IOExcepiton此种情况下怎样中断我想可以转换为通道来操作流可以解决比如文件通道。下面是具体实现 class Example6 extends Thread {volatile ServerSocket socket;public static void main(String args[]) throws Exception {Example6 thread new Example6();System.out.println(Starting thread...);thread.start();Thread.sleep(3000);System.out.println(Asking thread to stop...);Thread.currentThread().interrupt();// 再调用interrupt方法thread.socket.close();// 再调用close方法try {Thread.sleep(3000);} catch (InterruptedException e) {}System.out.println(Stopping application...);}public void run() {try {socket new ServerSocket(8888);} catch (IOException e) {System.out.println(Could not create the socket...);return;}while (!Thread.currentThread().isInterrupted()) {System.out.println(Waiting for connection...);try {socket.accept();} catch (IOException e) {System.out.println(accept() failed or interrupted...);Thread.currentThread().interrupt();//重新设置中断标示位}}System.out.println(Thread exiting under request...);} } --------------------------------------------------------------------------------------------------------------------------------------------------------- 一、没有任何语言方面的需求一个被中断的线程应该终止。中断一个线程只是为了引起该线程的注意被中断线程可以决定如何应对中断。 二、对于处于sleepjoin等操作的线程如果被调用interrupt()后会抛出InterruptedException然后线程的中断标志位会由true重置为false因为线程为了处理异常已经重新处于就绪状态。 三、不可中断的操作包括进入synchronized段以及Lock.lock()inputSteam.read()等调用interrupt()对于这几个问题无效因为它们都不抛出中断异常。如果拿不到资源它们会无限期阻塞下去。 对于Lock.lock()可以改用Lock.lockInterruptibly()可被中断的加锁操作它可以抛出中断异常。等同于等待时间无限长的Lock.tryLock(long time, TimeUnit unit)。 对于inputStream等资源有些(实现了interruptibleChannel接口)可以通过close()方法将资源关闭对应的阻塞也会被放开。 首先看看Thread类里的几个方法 public static boolean interrupted测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说如果连续两次调用该方法则第二次调用将返回 false。 public boolean isInterrupted() 测试线程是否已经中断。线程的中断状态 不受该方法的影响。 public void interrupt() 中断线程。 上面列出了与中断有关的几个方法及其行为可以看到interrupt是中断线程。如果不了解Java的中断机制这样的一种解释极容易造成误解认为调用了线程的interrupt方法就一定会中断线程。 其实Java的中断是一种协作机制。也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程它只是要求线程自己在合适的时机中断自己。每个线程都有一个boolean的中断状态这个状态不在Thread的属性上interrupt方法仅仅只是将该状态置为true。 比如对正常运行的线程调用interrupt()并不能终止他只是改变了interrupt标示符。 一般说来如果一个方法声明抛出InterruptedException表示该方法是可中断的,比如wait,sleep,join也就是说可中断方法会对interrupt调用做出响应例如sleep响应interrupt的操作包括清除中断状态抛出InterruptedException,异常都是由可中断方法自己抛出来的并不是直接由interrupt方法直接引起的。 Object.wait, Thread.sleep方法会不断的轮询监听 interrupted 标志位发现其设置为true后会停止阻塞并抛出 InterruptedException异常。 -------------------------------------------------------------------------------------------------------------------------------------------------------------- 看了以上的说明对java中断的使用肯定是会了但我想知道的是阻塞了的线程是如何通过interuppt方法完成停止阻塞并抛出interruptedException的这就要看Thread中native的interuppt0方法了。 第一步学习Java的JNI调用Native方法。 第二步下载openjdk的源代码找到目录结构里的openjdk-src\jdk\src\share\native\java\lang\Thread.c文件。 #include jni.h #include jvm.h#include java_lang_Thread.h#define THD Ljava/lang/Thread; #define OBJ Ljava/lang/Object; #define STE Ljava/lang/StackTraceElement;#define ARRAY_LENGTH(a) (sizeof(a)/sizeof(a[0]))static JNINativeMethod methods[] {{start0, ()V, (void *)JVM_StartThread},{stop0, ( OBJ )V, (void *)JVM_StopThread},{isAlive, ()Z, (void *)JVM_IsThreadAlive},{suspend0, ()V, (void *)JVM_SuspendThread},{resume0, ()V, (void *)JVM_ResumeThread},{setPriority0, (I)V, (void *)JVM_SetThreadPriority},{yield, ()V, (void *)JVM_Yield},{sleep, (J)V, (void *)JVM_Sleep},{currentThread, () THD, (void *)JVM_CurrentThread},{countStackFrames, ()I, (void *)JVM_CountStackFrames}, {interrupt0, ()V, (void *)JVM_Interrupt},{isInterrupted, (Z)Z, (void *)JVM_IsInterrupted},{holdsLock, ( OBJ )Z, (void *)JVM_HoldsLock},{getThreads, ()[ THD, (void *)JVM_GetAllThreads},{dumpThreads, ([ THD )[[ STE, (void *)JVM_DumpThreads}, };#undef THD #undef OBJ #undef STEJNIEXPORT void JNICALL Java_java_lang_Thread_registerNatives(JNIEnv *env, jclass cls) {(*env)-RegisterNatives(env, cls, methods, ARRAY_LENGTH(methods)); } 暂时还看不太懂先去学习一下C的一些基础。 未完待续...
http://www.zqtcl.cn/news/853311/

相关文章:

  • 做文库类网站网站所有权 备案
  • 网站开发主要内容站长之家网站查询
  • 网站推广优化排名公司wordpress添加说说
  • 维护一个网站要多少钱企业怎么做网站
  • 怎么做兼职网站成都必去十大网红景点
  • 网站建设如何传视频教程电脑网站设计公司
  • 网站开发培训教程制作网站开发公司
  • 网站前端做报名框代码seo教育培训机构
  • 做网站要学习什么分销网站
  • 镇江市住房和城乡建设局网站常州建设网站
  • 学做美食的网站男女做暖暖到网站
  • 手机的网站建设目标刚做的网站 搜不到
  • 重庆网站建设哪里比较好呢ps怎么做网站logo
  • 网站建设五项基本原则优化关键词的公司
  • 高端网站的特点p2p网站开发的流程
  • 什么网站做外贸最好坪地网站建设公司
  • 做网站费用怎么核算没有公司 接单做网站
  • 如何建设一个优秀的电商网站wordpress注册去掉电子邮件
  • 站长工具 seo综合查询长沙高校网站制作公司
  • 杭州网站定制开发哪家好wordpress重置
  • 哈尔滨市建设安全网站火车头更新wordpress
  • 做亚马逊外国网站需要语言好吗邢台seo
  • jsp在网站开发中的优势国内哪个推广网站做的好
  • 做网站工资高吗精品资料
  • 做农业需关注什么网站热门代理项目
  • 网站开发公司营业范围照片制作视频软件app
  • 做网站怎么qq邮箱验证免费拥有wordpress
  • 校园网站建设资金来源有wordpress权重
  • 魔站网站开发wordpress 3.3.1
  • 东莞个人免费建网站网站后台管理系统 asp