输入 / 输出是在主存和外部设备(例如磁盘驱动器 、终端和网络 ) 之间复制数据的过 (I/O) 程:
- I(输入操作):从 I/O 设备复制数据到主存
- O(输出操作):从主存复制 数据到 I/O 设备
在 Java 中, I/O 大概可以分成:
- 磁盘操作:File
- 字节操作:InputStream 和 OutputStream
- 字符操作:Reader 和 Writer
- 对象操作:Serializable
- 加强版:NIO
当我们启动一个应用程序的时候,根据不同应用场景的需要,主线程通常需要承担很多串行任务,比如:
若每个操作的耗时都只是毫秒级的话,其实没有必要引人额外的执行流程,单线程就已经足够用了。
然而在大多数实际的应用程序中,很多操作的执行速度并没有这么快,某些计算的执行时间甚至需要几秒到几分钟不等。例如,某些需要从 Web 服务中获取数据的请求可能会遭遇网络延迟,所以执行线程就只好等待对端响应到达后才能继续执行。当单线程的应用程序遇到这种情况时,由于主线程被挂起在某个操作上,所以该应用程序的用户将无法与之进行交互或中断其当前任务的执行。
发生这种情况自然是我们不愿意看到的,因为用户的体验不好,为了让用户获得更好的体验,我们希望应用程序应当拥有这种能力——能够执行的更快,以使得请求响应时间缩短。
这个时候,就我们就想到了使用多线程程序,不过编写多线程程序之前,我们得先了解一些概念。
泛型程序设计(generic programming)是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。Ada、Delphi、Eiffel、Java、C#、F#、Swift) 和 Visual Basic .NET 称之为泛型(generics);ML、Scala 和 Haskell 称之为参数多态(parametric polymorphism);C++ 和 D称之为模板)。具有广泛影响的1994年版的《Design Patterns》一书称之为参数化类型(parameterized type)。