
java高级基础
文章平均质量分 51
11onhook
这个作者很懒,什么都没留下…
展开
-
JAVA高级基础(78)---生产者消费者模型
在线程通信中,有一个非常典型的例子: 生产者消费者模式一种重要的模型,基于 等待/通知 机制。生产者/消费者 模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点:生产者生产的时候消费者不能消费 消费者消费的时候生产者不能生产 缓冲区空时消费...原创 2019-01-20 16:33:03 · 141 阅读 · 0 评论 -
JAVA高级基础(43)---数据流和打印流
数据流DataInputStream / DataOutputStream 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中打印流PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式注:更多方法请查找APISystem.out.print();输出内容不换行 System.out.printl...原创 2018-12-10 14:49:53 · 226 阅读 · 0 评论 -
JAVA高级基础(42)---对象流
对象流 ObjectInputStream / ObjectOutputStream 要求读写的对象必须进行序列化ObjectInputStreamObjectOutputStream序列化的目的就为了对象的传输。保证传输对象的一致性。如何序列化只需要将需要序列化的类实现 Serializable 接口就可以了可以使用对...原创 2018-12-10 14:42:16 · 280 阅读 · 0 评论 -
JAVA高级基础(41)---RandomAccessFiled的应用
RandomAccessFile的应用断点下载 断点续传 复制一个大的文件package org.lanqiao.randomaccessfile.demo;import java.io.FileNotFoundException;import java.io.IOException;import java.io.RandomAccessFile;/* * 当下载中断的时候...原创 2018-12-10 14:23:37 · 137 阅读 · 0 评论 -
JAVA高级基础(40)---RandomAccessFile
RandomAccessFile随机访问文件。可以通过在创建对象的时候,指定模式:r 读模式 / rw 写模式在其中存在指针,来定位对文件进行读写的位置getPointFile(); 获取指针位置 seek(long pos )设置指针位置在读取文件的时候,我们要注意一问题:是否存在读取一个字符串的方式。在读的时候,要注意转换为字符串的时候的编码方式readLine(...原创 2018-12-10 14:19:48 · 167 阅读 · 0 评论 -
JAVA高级基础(70)---并发编程Executor简介及线程池的创建方式
并发编程--Executor我们在传统多线程编程创建线程时常常是创建一些 Runnable 对象,然后创建对应的Thread对象执行它们,但是如果程序需要并发执行大量的任务时,需要为每个任务都创建一个Thread,进行管理,这将会影响程序的执行效率,并且创建线程过多将会使系统负载过重。在Java 5 之后,并发编程引入看一堆新的启动、调度和管理线程的API。Executor框架便是Java...原创 2018-12-26 16:10:36 · 257 阅读 · 0 评论 -
JAVA高级基础(69)---多线程环境安全使用集合框架API
在当前 jdk 下,即使我们要求集合要保证线程安全,我们也不会在去使用 vector 和 HahsTableCollectionssynchronizedList(List<T> list) synchronizedMap(Map<K,V> m) synchronizedSet(Set<T> s)package org.lanqiao.syn.d...原创 2018-12-26 15:29:41 · 178 阅读 · 0 评论 -
JAVA高级基础(68)---定时任务
定时任务Timer -> TimerTask注:详细方法请查询APIschedule(TimerTask task,Date firstDate,long period) 执行任务 从什么时间开始执行 每次执行的间隔毫秒数package org.lanqiao.timer.demo;import java.text.ParseException...原创 2018-12-26 15:21:08 · 158 阅读 · 0 评论 -
JAVA高级基础(67)---线程同步
线程同步两种方式:使用 同步代码块、同步方法 什么情况下需要同步?当多线程并发, 有多段代码同时执行时, 我们希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步.如果两段代码是同步的, 那么同一时间只能执行一段, 在一段代码没执行结束之前, 不会执行另外一段代码. 多线程安全问题的原因(也是我们以后判断一个程序是否有线程安全问题的依据)A:是...原创 2018-12-26 15:09:24 · 130 阅读 · 0 评论 -
JAVA高级基础(63)---创建新的线程
Java程序的运行原理当使用Java命令启动一个程序的时候,JVM启动。就启动了一个进程。 main方法会执行。main方法的运行就是该进程中的一个线程(主线程)。也会启动GC,GC是后台线程(守护线程)。package org.lanqiao.thread.demo;public class ThreadDemo { public static void main(String[...原创 2018-12-15 11:30:40 · 247 阅读 · 0 评论 -
JAVA高级基础(62)---多线程的介绍
多线程进程:运行中的一个程序,在计算机中的一个运行路径。一个程序只能有一个进程线程:是进程的一个组成单元。在一个进程中至少有一个或一个以上的线程存在Java是最先支持多线程开发的语言之一,Java从一开始就支持了多线程能力,因此Java开发者能常遇到上面描述的问题场景。进程和线程的区别是否占有资源问题 一个进程的创建/撤销所需要的开销远远大于一个线程所需要的开销 进...原创 2018-12-15 11:22:22 · 172 阅读 · 0 评论 -
JAVA高级基础(33)---字符缓冲流
字符缓冲流缓冲流:当我们在创建缓冲流的时候,会默认在系统内存中为当前流分配一定大小的缓冲区字符缓冲输入流特殊方法:String readLine();每次读取一行 返回值:当前行的内容,不包括终止符(\r、\n、\r\n)字符缓冲输出流特殊方法:newLine(); 输出一个行终止符 与操作系统无关 相关代码package org.lanqiao.bu...原创 2018-12-07 10:06:19 · 212 阅读 · 0 评论 -
JAVA高级基础(61)---代理模式
代理模式静态代理代理的实现完全由程序员自己来实现 改实现只能针对特定的对象来实现代理(就是对被代理对象起到一个增强的作用。)实现步骤定义主业务的接口 实现接口 通过代理来增强主业务方法package org.lanqiao.proxy.demo;//被代理对象public class Customer implements SallTicket { @Overrid...原创 2018-12-14 11:37:22 · 163 阅读 · 0 评论 -
JAVA高级基础(60)---动态操作数组
使用反射来操作数组 创建数组 判断是否是数组 获取数组的长度 获取数组的类型 Array是动态创建数组和操作数组的一个类package org.lanqiao.reflectarray.demo;import java.lang.reflect.Array;public class ReflectArray { public static void main(...原创 2018-12-14 10:53:01 · 159 阅读 · 0 评论 -
JAVA高级基础(32)---字符流
字符流 字符输入流:Reader 字符输出流:Writer Writer(abstract)--->OutputStreamWriter--->FileWriterOutputStreamWriter (将字节转换为字符流的一个类)字符输出流需要进行flush字符流编码常用的...原创 2018-12-06 16:46:29 · 202 阅读 · 0 评论 -
JAVA高级基础(31)---字节缓冲流
字节缓冲流BufferredInputStreambos.flush();//将缓冲区强制刷新bos.close();//在关闭输出流的时候,首先会执行 flush 将缓冲区的数据刷新清空,然后再关闭流。注意在使用缓冲输出流的时候,必须进行强制刷新或者closepackage org.lanqiao.buff.demo;import java.io.Buffered...原创 2018-12-06 16:37:47 · 436 阅读 · 0 评论 -
JAVA高级基础(30)---字节输入输出流完成文件复制
字节输入流InputStream 注:更多方法请查找APIpackage org.lanqiao.inputstream.demo;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;impo...原创 2018-12-06 16:08:28 · 447 阅读 · 0 评论 -
JAVA高级基础(44)---NIO简介及缓冲区介绍
NIOJava NIO(New IO)是从Java1.4版本开始引入的一个新的IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO支持面向缓冲区的、基于通道的IO操作。 NIO将以更加高效的方式进行文件的读写操作。 NIO采取通道(Channel)和缓冲区(Buffer)来传输和保存数据,它是非阻塞式的I/O,...原创 2018-12-10 15:20:48 · 255 阅读 · 1 评论 -
JAVA高级基础(45)---缓冲区操作
package org.lanqiao.buffer.demo;import java.nio.ByteBuffer;public class BufferDemo { public static void main(String[] args) { //开辟缓冲区 分配缓冲区 ByteBuffer buf = ByteBuffer.allocate(1024); /...原创 2018-12-10 15:25:35 · 284 阅读 · 0 评论 -
JAVA高级基础(64)---使用匿名内部类实现多线程
package org.lanqiao.thread.demo;/* * 通过匿名内部类来显示多线程 */public class ThreadDemo { public static void main(String[] args) { new Thread() { @Override public void run() { for(int i ...原创 2018-12-16 09:56:01 · 151 阅读 · 0 评论 -
JAVA高级基础(77)---互斥锁
互斥锁 JDK1.5的新特性:互斥锁所谓互斥锁,指的是一次最多只能有一个线程持有的锁。在jdk1.5之前,我们通常使用synchronized机制控制多个线程对共享资源的访问。而现在,Lock提供了比synchronized机制更广泛的锁定操作。线程同步:使用ReentrantLock类的lock()和unlock()方法进行同步通信通信:使用ReentrantLock...原创 2019-01-20 16:22:04 · 270 阅读 · 0 评论 -
JAVA高级基础(76)---线程通信
线程通信线程由运行到阻塞 再到就绪主要用到的方法Object类中的wait()//时线程处于等待状态,如果没有线程来唤醒 那么该线程将一直处于等待状态,直到有线程调用notify /notifyAll来唤醒该线程。 wait(long min); 也会是线程处于等待状态;线程重新回到就绪状态的条件:一 、等到的时间到 二、 有线程调用notify /notifyAll来唤醒该...原创 2019-01-20 16:12:43 · 285 阅读 · 1 评论 -
JAVA高级基础(75)---死锁问题
死锁问题当多线程执行任务时,存在线程并发的问题时,因为为了保证共享数据的安全,需要在每个线程执行任务时不允许其他线程执行该任务,需要在线程执行时,添加同步,添加锁。如果是单任务,则不会出现。如果在该任务中,需要同步多条语句,且每个同步语句使用的锁不同,那么就有可能出现死锁问题。例子:两个人去就餐,但是只有一双筷子。只有一个人同时拿到两只筷子,才可以吃东西。死锁产生两个线程,分别持有...原创 2019-01-19 14:37:41 · 140 阅读 · 0 评论 -
JAVA高级基础(74)---线程协作_销售火车票Executor方式
package org.lanqiao.thread.demo;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Execut...原创 2019-01-19 14:31:16 · 217 阅读 · 0 评论 -
JAVA高级基础(73)---线程协作_销售火车票传统方式
线程的协作: 1 一列火车有100个座位,现在由5个售票窗口来进行销售。package org.lanqiao.thread.demo;//一列火车有100个座位,现在由5个售票窗口来进行销售。//使用传统的线程来实现public class SellerTicket { public static void main(String[] args) { Thr...原创 2019-01-19 14:29:43 · 190 阅读 · 0 评论 -
JAVA高级基础(72)---Executor执行Callable任务
Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用Future 但又不提供可用的结果,则可以声明 Future<...原创 2019-01-19 14:25:04 · 392 阅读 · 0 评论 -
JAVA高级基础(71)---Executor执行Runnable任务
Executor框架:支持并发编程的线程池Executors1、ExecutorService newFixedThreadPool(int initThread)在线程池中,创建固定数目的线程。当执行任务的时候,如果线程池中由空闲线程,则直接使用该线程来执行任务,如果没有空闲线程,则任务处于阻塞状态,等待线程空闲。2、ExecutorService newCacheT...原创 2019-01-19 14:21:42 · 1023 阅读 · 0 评论 -
JAVA高级基础(52)---非阻塞式的IO通信
非阻塞式客户端获取通道 切换非阻塞模式 分配指定大小的缓冲区 发送数据给服务端 关闭通道 服务端获取通道 切换非阻塞模式 绑定连接 获取选择器 将通道注册到选择器上, 并且指定“监听接收事件” 轮询式的获取选择器上已经“准备就绪”的事件 获取当前选择器中所有注册的“选择键(已就绪的监听事件)” 获取准备“就绪”的是事件 判断具体是什么事件准备就绪 若“接收就...原创 2018-12-11 15:56:05 · 253 阅读 · 0 评论 -
JAVA高级基础(51)---有反馈的阻塞式的IO网络通信
package org.lanqiao.blocking2.demo;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;import java.nio.channels.SocketCh...原创 2018-12-11 15:52:55 · 123 阅读 · 0 评论 -
JAVA高级基础(50)---阻塞式的IO网络通信
网络通信的三要素IP地址:可以唯一的定位到一台计算机 端口号:可以唯一的定位到一个程序 通信协议:TCP/IP UDP阻塞式客户端获取通道 分配指定大小的缓冲区 读取本地文件,并发送到服务端 关闭通道服务端获取通道 绑定连接 获取客户端连接的通道 分配指定大小的缓冲区 接收客户端的数据,并保存到本地 关闭通道package org.lanqiao...原创 2018-12-11 15:48:18 · 136 阅读 · 0 评论 -
JAVA高级基础(49)---分散读取和聚集写入
分散读取和聚集写入read(ByteBuffer[] bufs); //分散读取 write(ByteBuffer[] bufs); //聚集写入分散读取(Scattering Reads)是指从Channle中读取的数据“分散”到多个Buffer中注意:按照缓冲区的顺序,从Channle中读取的数据依次将Buffer填满聚集写入(Gathering Writes)是指将多...原创 2018-12-11 15:34:39 · 374 阅读 · 0 评论 -
JAVA高级基础(48)---使用通道完成文件数据传输
通道(Channel):传输数据由 java.nio.channels 包定义的。Channel表示IO源与目标打开的链接。Channel类似于传统的“流”。只不过Channel本身不能直接访问数据,Channel只能与 Buffer 进行交互 IO 改进示意图 DMA(直接存储器访问)Java 为 Channel 接口提供的最主要实现类如下:FileChannel...原创 2018-12-11 15:27:38 · 398 阅读 · 0 评论 -
JAVA高级基础(47)---直接缓冲区和非直接缓冲区
直接和非直接缓冲区字节缓冲区要么是直接的,要么是非直接的。如果为直接字节缓冲区,则Java虚拟机会尽最大努力直接在此缓冲区上执行本机I/O操作。也就是说,在每次调用基础操作系统的一个本机I/O操作之前(或之后),虚拟机都会尽量避免将缓冲区的内容复制到中间缓冲区中(或从中间缓冲区中复制内容)直接字节缓冲区可以通过调用此类的 allocateDirect() 工厂方法来创建。此方法返回的缓冲区...原创 2018-12-11 10:31:35 · 220 阅读 · 0 评论 -
JAVA高级基础(46)---NIO之Buffer常用方法
常见实现ByteBuffer CharBuffer ShortBuffer IntBuffer LongBuffer FloatBuffer DoubleBuffer缓冲区的使用建立缓冲区, 分配容量 ByteBuffer buf = ByteBuffer.allocate(capacity); 装载数据:put();及其重载方法 改变缓冲区的读写模式:fli...原创 2018-12-11 10:04:03 · 185 阅读 · 0 评论 -
JAVA高级基础(34)---装饰设计模式
装饰者设计模式(Decorator)类A:method();类B:继承类A 重写method();继承实现代码的扩展的弊端:增强了两个类的耦合度 受到了Java中单继承的限制。装饰者设计模式:在不改变原类的情况下,对类的功能进行扩展装饰设计模式的要求在装饰类中,必须包含被装饰对象 在扩展功能时,需要在装饰类的构造方法中对被装饰对象进行初始化 在扩展的方法中,需要通过...原创 2018-12-07 10:20:06 · 130 阅读 · 0 评论 -
JAVA高级基础(66)---线程的生命周期
线程的生命周期线程从创建到运行再到死亡的整个过程。在线程整个生命周期中,线程总共分为了五中状态:新建:线程对象创建 就绪:通过线程的start方法启动线程,线程就处于就绪状态,等待线程调度,获取CPU的执行权。 运行:线程获得CPU的执行权,处于运行中。 阻塞:线程在执行期间,因为某种原因(休眠,礼让,时间到达),暂时失去CPU 的执行权,等待再次获得CPU的执行权。 死亡:当...原创 2018-12-16 10:37:08 · 244 阅读 · 0 评论 -
JAVA高级基础(65)---线程控制方法及获取系统当前线程
线程名称设置名称:Thread(Runnable target,String name) getName();返回线程名称 getId();获取线程的ID setName(String name);设置线程名称在创建线程时,系统会默认为每个线程分配一个名称:Thread-0 Thread...原创 2018-12-16 10:09:51 · 673 阅读 · 0 评论 -
JAVA高级基础(29)---字节输出流
字节流 8位 --- 1字节 16位--2个字节--1 字符 字节输入流--->读取文件,读取数据到程序(内存)字节输出流--->写数据到外部存储设备 字节流输出流OutputStream注:更多方法请查找APIpackage org.lanqiao.outputstream.demo;import java.io...原创 2018-12-06 16:00:14 · 180 阅读 · 0 评论 -
JAVA高级基础(59)---工厂设计模式
工厂设计模式1.简单工厂构成抽象产品类:定义产品的标准和规范 具体产品类:具体实现产品的标准和规范 简单工厂类:根据需求,创建产品对象优点将产品对象的创建,不在由我们自己来new 而是由工厂来进行创建缺点是工厂和产品之间产生了高度的耦合,工厂的设计不符合类设计的开闭原则:类的扩展性不强package org.lanqiao.simplefactory.demo;...原创 2018-12-13 11:14:46 · 195 阅读 · 0 评论 -
JAVA高级基础(58)---简单工厂模式
工厂模式简单工厂模式 工厂方法模式 抽象工厂模式简单工厂模式简单工厂模式又称为静态工厂方法模式。从命名上就可以看出这个模式一定很简单。就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。工厂角色:这是本模式的核心,含有一定的业务逻辑和判断逻辑。在jav...原创 2018-12-13 10:42:05 · 188 阅读 · 0 评论