`
sunhuaer123
  • 浏览: 6077 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Java并行开发笔记5

    博客分类:
  • java
阅读更多

不可中断的阻塞:

  • Java.io 包中的同步 Socket/IO。 在服务器应用程序中,最常见的阻塞I/O形式就是对套接字进行读取和写入。虽然InputStream和OutputStream中的read和write等方法都不会响应中断,但通过关闭底层的套接字,可以使得由于执行read或write等方法而被阻塞的线程抛出一个SocketException。
  • Java.io包中的同步I/O。 当中断一个正在InterruptibleChannel上等待的线程时,将抛出ClosedByInterruptException并关闭链路(这还会使得其他在这条链路上阻塞的线程同样抛出ClosedByInterruptException)。当关闭一个InterruptibleChannel时,将导致所有在链路操作上阻塞的线程都抛出AsynchronousCloseException。大多数标准的Channel都实现了InterruptibleChannel。
  • Selector的异步I/O。 如果一个线程在调用Selector.select方法(在java.nio.channels中)时阻塞了,那么调用close或wakeup方法会使线程抛出ClosedSelectorException并提前返回。
  • 获取某个锁。 如果一个线程由于等待某个内置锁而阻塞,那么将无法响应中断,因为线程认为它肯定会获得锁,所以将不会理会中断请求。但是,在Lock类中提供了lockInterruptibly方法,该方法允许在等待一个锁的同时仍能响应中断。

  通过改写interrupt方法将非标准的取消操作封装在Thread中

public class ReaderThread extends Thread {
	private static final int BUFSZ = 2048;
	private final Socket socket;
	private final InputStream in;
	
	public ReaderThread(Socket socket) throws IOException{
		this.socket = socket;
		this.in = socket.getInputStream();
	}
	
	@Override
	public void interrupt() {
		try{
			socket.close();
		}catch(IOException ignored)
		{
			
		}finally{
			super.interrupt();
		}
	}

	@Override
	public void run() {
		try {
			byte[] buf = new byte[BUFSZ];
			while(true){
				int count = in.read(buf);
				if(count<0)
					break;
				else if(count>0){
					processBuffer(buf,count);
				}
			}
		} catch (IOException e) {
			/* 允许线程退出 */
		}
	}

	private void processBuffer(byte[] buf, int count) {
		// TODO Auto-generated method stub
		
	}
}

  通过newTaskFor将非标准的取消操作封装在一个任务中

public interface CancellableTask<T> extends Callable<T>{
      void cancel();
      RunnableFuture<T> newTask();
}

@ThreadSafe
public  class CancellingExecutor extends ThreadPoolExecutor{
     ...
     protected<T> RunnableFuture<T> newTaskFor(Callable<T> callable){
          if(callable instanceof CancellableTask)
               return ((CancellableTask<T>) callable).newTask();
          else
               return super.newTaskFor(callable);
     }

}

public abstract class SocketUsingTask<T> implements CancellableTask<T>{

      @GuardedBy("this") private Socket socket;

      protected synchronized void setSocket(Socket s){
         socket = s; 
      }
       
      public synchronized void cancel(){
         try{
            if(socket != null)
                socket.close();
         }catch(IOException ignored){}
      }

      public RunnableFuture<T> newTask(){
          return new FutureTask<T>(this){
               public boolean cancel(boolean mayInterruptIfRunning){
                   try{
                        SocketUsingTask.this.cancel();
                   }finally{
                        return super.cancel(mayInterruptIfRunning);
                   }
               }
          };

      }
}
分享到:
评论

相关推荐

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《java jdk 7学习笔记》适合java的初中级读者,以及广大java应用开发人员。 作译者 林信良(网名:良葛格) 学历:台湾大学电机工程学系 经历:台湾升阳教育训练技术顾问、专业讲师,oracle授权训练中心讲师 ...

    实战Java高并发程序设计 .pdf 下载

    在过去单核CPU时代,单任务在一个时间点只能执行单一程序,随着多核CPU的发展,并行程序开发就显得尤为重要。 《实战Java高并发程序设计》主要介绍基于Java的并行程序设计基础、思路、方法和实战。第一,立足于...

    Java并发编程学习笔记 pdf 多线程编程

    Java并发编程学习笔记,研究JAVA并发多线程编程的一本教程,使用并发技术可以开发出并行算法,充分利用多处理器的计算能力,避免硬件资源浪费。目前,在JAVA并发编程方面的论述系统且内容详实的技术资料不太多,Java...

    Java运行环境 Java SE Runtime Environment 8.0.172.x86官方多语言正式版

    Java SE 8 通过减少样板代码,改进了集合和注释,简单的并行编程模型和更有效地利用现代多核处理器,提高了开发人员的工作效率和显着的增强了应用程序的性能。 Java SE 8u172 版本更新:2018年4月17日

    Java运行环境 Java SE Runtime Environment 8.0.172.x64官方多语言正式版

    Java SE 8 通过减少样板代码,改进了集合和注释,简单的并行编程模型和更有效地利用现代多核处理器,提高了开发人员的工作效率和显着的增强了应用程序的性能。 Java SE 8u172 版本更新:2018年4月17日

    Java优化编程(第2版)

    本书不是教你怎样使用Java语言开发应用程序,而是教你怎样才能开发出更高效、更优秀的Java应用程序。书中每一个例子都经过了作者严格的验证。 本书适合于所有想编写更高效、完美Java应用程序的开发人员阅读。 本书...

    Java并发编程(学习笔记).xmind

    Java 5 Java 6 同步工具类 闭锁 *应用场景 (1)确保某个计算在其需要的所有资源都被初始化后才能继续执行 (2)确保某个服务在其所依赖的所有其他服务都已经启动之后才启动 ...

    javasnmp源码-development-note:开发笔记

    snmp源码软件开发笔记 请分叉并贡献。 编排、配置管理和 DevOps 工具: - Packer 是一种用于从单一源配置为多个平台创建相同机器映像的工具。 - 服务器自动化框架和应用 - Vagrant 是用于创建和配置虚拟开发环境的...

    阿里云ossjava源码-awesomelibs:各种开发语言和开发工具的很棒的库

    适用于各种开发语言和开发工具的很棒的库。 给出了一些推荐的选项。 您还可以看到更多选项。 本网站来源: 常见的 石英 提琴手 戈格斯 影袜 kcptun 代理链 海文件 邮差 代理 平++ 图形语言 免费的 SSL 证书 ...

    java程序员刷题软件-Portfolio:著名计划和项目的集合

    java程序员刷题软件文件夹 这个存储库包含我参与过的著名程序和项目的集合。 README 为每个程序提供了简要说明,以及...我开发的轻量级笔记应用程序,灵感来自 Google Keep。 从美国境内的监测站收集预测和历史潮汐信

    流动站java笔试题-notes:只是我自己的笔记

    流动站java笔试题我写的笔记到处都是,我的写作也是如此。 所以我将尝试将它集中在这里。 专注于语言:C++、Javascript 和 Go。 我将在我生命的接下来几年中使用这些语言 - 最好用几种语言完善自己,而不是把所有...

    基于lucene和nutch的开源搜索引擎资料集合

    其中内容均为前段时间研究开源搜索引擎时搜集参考的资料,非常齐全包含的内容有: Computing PageRank Using Hadoop.ppt Google的秘密PageRank彻底解说中文版.doc ...用_Hadoop_进行分布式并行编程.doc

    notes:我的笔记-PWA笔记本

    沙里亚尔的笔记 原则 比特科技 算法 CI / CD 开发运维 地理信息系统 集成开发环境 3D 资源 概念 统一 虚拟现实 云 云 蔚蓝 Kubernetes 语言能力 Java s VueJS 打字稿 React p Cpp C# F# 去 斯威夫特/ ...

    port-scanner:使用 NMAP 扫描端口并在 mysql 数据库中保存历史记录的演示项目

    开发笔记 在我的 Windows 8 笔记本电脑上,当您尝试一次扫描两个或三个以上的主机时,我注意到 NMAP 存在问题。 我正在并行运行请求,所以我不确定这是否是由 java 承诺或 NMAP 本身无法同时运行引起的错误。 这个...

    基于SpringBoot+Vue智能学习平台系统(源码+部署说明+演示视频+源码介绍).zip

    这种架构使得前后端可以并行开发,大大提高了开发效率。 系统功能丰富,包括用户管理、课程管理、在线学习、考试评估等多个模块。用户管理模块可以实现用户的注册、登录、信息修改等功能;课程管理模块可以对课程...

    Rational Rose学习.doc

    Rational Rose 支持多用户并行开发,可以使用控制单元来协调多个用户的开发工作。 输入输出模型 在 Rational Rose 中,输入输出模型是指输出包或者类时,必须选定逻辑视图里的东西;而要输出模型,则是选定...

    materiais-pos-graduacao:Minas Gerais天主教大学(PUC-MG)使用Python 3以及关系和非关系数据库(Oracle,MongoDB,Redis,Neo4J)的脚本和笔记本存储库,用于数据科学和大数据的毕业后研究)

    在专业课程中开发的材料和脚本 Minas Gerais天主教大学(PUC-MG)使用Python 3以及关系和非关系数据库(Oracle,MongoDB,Redis,Neo4J)的脚本和笔记本存储库,用于数据科学和大数据的毕业后研究) 技术涵盖 的...

    nifi-minifi:Apache MiNiFi(Apache NiFi的子项目)

    执行mvn clean install或者对于并行构建,执行mvn -T 2.0C clean install 。 在使用了几年的适度开发笔记本电脑上,后者的构建花费了不到两分钟的时间。 经过大量输出之后,您最终应该会看到一条成功消息。

    javaee笔试题-ES2016_14353173:ES2016_14353173

    layer)是一个用于编写并行应用程序的软件开发框架。DOL允许指定基于计算Kahn进程网络模型的应用程序和具有一个基于SystemC的模拟引擎的特点。而且,DOL提供了一个基于XML规范的格式来描述在一个多处理器系统上的并行...

    matlab梁代码-MyBlog:我的博客

    matlab 梁代码 目录 C++ C++ STL Java 数据结构与算法 Internet ...《CUDA并行程序设计-GPU编程指南》读书笔记 《设计模式之禅》读书笔记 微信公众平台开发 WordPress git IDE UML Matlab DSP 其他

Global site tag (gtag.js) - Google Analytics