`
yuwenlin2008
  • 浏览: 127547 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表

Java回调接口

所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式: Class A实现接口CallBac ...
在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。   这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。   如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。   而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。   今天我们就来讨论一下Callable、Future和FutureTask三个类的使用方法。以下是本文的目录大纲:   一.Callable与Runnable   二.Future ...
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。   以下是本文目录大纲:   一.CountDownLatch用法   二.CyclicBarrier用法   三.Semaphore用法   一.CountDownLatch用法 CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLa ...
我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:   如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。   那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?   在Java中可以通过线程池来达到这样的效果。今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPoolExecutor类中的方法讲起,然后再讲述它的实现原理,接着给出了它的使用示例,最后讨论了一下如何合理配置线程池的大小。   以 ...
今天我们来讨论另外一类容器:阻塞队列。   在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了Dequeue接口)。   使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦。但是有了阻塞队列就不一样了,它会对当前线程产生阻塞,比如一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素。当队列中有元素后,被阻塞的线程会自动被唤醒(不需要我们编写代码去唤醒)。这样提供了极大的 ...
本篇介绍ThreadLocal以下三点: 1.ThreadLocal概述 2.ThreadLocal基本操作 3.ThreadLoad实现原理   一、ThreadLocal概述 ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。 举个例子,我出门需要先坐公交再做地铁,这里的坐公交和坐地铁就好比是同一个线程内的两个函数,我就是一个线程,我要完成这两个函数都需要同一个东西:公交卡(北京公交和地铁都使用公交卡),那么我为了不向这两个函数都传递公交卡这个变量(相当于不是一直带着公交 ...
策略模式,定义了统一的服务接口,封装了不同的实现,对外提供统一的上下文接口,隐藏具体实现。 通俗讲就是:相同的功能,不同的规则、算法实现,就可以用策略模式。 比如支付功能,系统提供阿里支付,微信支付,银联支付,都是支付功能,不同的实现接口,下面来模拟一下策略模式的实现。 /** * 策略接口定义 */ public abstract class PayStrategy { public static final String ALI_PAY = "Ali"; public static final String WX_PAY = &quo ...
模板方法模式,一般是为了统一子类的算法实现步骤,所使用的一种手段或方式。它在父类定义一系列的算法步骤,而将具体实现推迟到子类。 通常情况下,模板方法模式用于定义构建某个对象的步骤与顺序,或定义一个算法的骨架。 通常来说父类定义的步骤和顺序或算法骨架,是不允许子类覆盖的,所以在某些场景中,可以直接将父类提供的骨架方法声明为final类型的。 下面模拟构建一个html页面,来应用模板方法模式: 父类定义构建一个html页面的步骤算法:   public abstract class AbstractPageBuild { private StringBuffer stringB ...
说起代理模式,我们想到的就是Spring AOP的实现,主要场景有记录日志,事务管理等。 而Spring AOP实现代理模式有两种方式,一种是基于接口的JDK动态代理,一种是基于类的CGlib,今天我们要说的就是基于接口的JDK动态代理。主要从两个方面介绍,一个是使用,一个是原理。   JDK的动态代理如何使用呢?比如我们有这样的需求,要统计Service层的各个方法的开始时间,结束时间,及每个方法的运行时间。如果用常规做法呢就是在每个方法里加startTime,endTime然后相减,这太累了,那方法多得去了。下面来看用JDK的动态代理如何实现这个功能: 以UserService举例 ...
单例模式简单但重要,主要作用就是保证一个类只能有一个实例对象。   单例模式特点如下: 1.必须由类自身来构造实例对象。 2.类的构造方法必须私有化。 3.对外提供静态方法用于获取实例对象。 4.不同的代码写法需要考虑线程安全的问题。   先来看第一种实现方式: public class NoSafeSingleton { private static NoSafeSingleton singleton;
本篇主要对Java基础中BIO文件输入输出流做一个总结。 首先来看一下IO流的分类,图片来自网络: 直接上代码吧:   1.字节输入流FileInputStream,字节输出流FileOutputStream: /** * FileInputStream 读取原始字节流 **/ public class TestFileInputStream{ public static void main(String []args){ FileInputStream fis = null; try{ fis = new FileInputStream(&q ...
Object 类是所有类的父类,Object类中定义了很多重要的方法,有些基础方法是必须要搞清楚的,今天我们就来学习下Object类中的equals方法和hashCode方法。   一、equals方法 首先我们来看下Object类的equals方法的源码: public boolean equals(Object obj) { return (this == obj); } 很明显它是比较两个对象的引用(即内存地址)是否相等。如果你不知道这个,想当然的以为它比较的是内容,比如我们要比较两个用户对象是否相等: User实体类: public class Use ...
静态变量静态方法 static关键字基本用法: 1.被static修饰的变量为静态变量,通过类名.变量名可以直接访问。 2.被static修饰的方法为静态方法,通过类名.方法名可以直接访问。 静态变量和静态方法属于类自身,被类对象实例共享。 有些人容易混淆的一个问题:静态方法能不能引用非静态资源?静态方法里面能不能引用静态资源?非静态方法里面能不能引用静态资源?比如就以这段代码为例,是否有错? public class StaticTest { private int i; public static void main(String[] ...
我们都知道Java中final关键字的用法: 被fiinal修饰的类不能被继承。 被final修饰的方法不能被重写。 被final修饰的变量不能被修改。         然而,被final修饰的变量不能被修改,这个怎么理解呢,是变量的值不能被修改,还是引用不能被修改呢,引用的对象可以被修改吗,我们来看代码: package com.yuwl.jdk; /** * 测试内容:final修饰变量 * @author Yuwl * 2018-3-18 */ public class FinalTest { private final int one = 1; ...
关于这个错,其实网上有很多解决方案,这里记录主要是我被踩坑了,坑就在下面。 我在import maven项目时,pom.xml报错Missing artifact com.sun:tools:jar:1.5.0,经过盘查发现是pom引入的struts2相关jar包导致报错。 上网查询说是struts2-core.jar需要依赖Java运行时的tools.jar,解决方案就是将这个jar包手动引入。 解决方案一: <dependency> <groupId>com.sun</groupId> <art ...
Global site tag (gtag.js) - Google Analytics