GSON、LinkedTransferQueue、StringUtils

Gson-Typetoken

public class JsonUtils {
    private static final Gson gson = new Gson();

    public static <T> T fromJson(String jsonStr, Class<T> clazz) {
        return gson.fromJson(jsonStr, clazz);
    }

    public static <T> String toJson(T t) {
        return gson.toJson(t);
    }
}
private static final Class headerType = new TypeToken<Map<String, String>>() {
}.getRawType();

//调用的时候
Map<String, String> headerMap = (Map<String, String>) JsonUtils.fromJson(header, headerType);

LinkedTransferQueue阻塞队列

LinkedTransferQueue是一个由链表结构组成的无界阻塞TransferQueue队列。相对于其他阻塞队列,LinkedTransferQueue多了tryTransfer和transfer方法。

LinkedTransferQueue采用一种预占模式。意思就是消费者线程取元素时,如果队列不为空,则直接取走数据;若队列为空,那就生成一个节点(节点元素为null)入队,然后消费者线程被等待在这个节点上,后面生产者线程入队时发现有一个元素为null的节点,生产者线程就不入队了,直接就将元素填充到该节点,并唤醒该节点等待的线程,被唤醒的消费者线程取走元素,从调用的方法返回。我们称这种节点操作为“匹配”方式。

LinkedTransferQueue是ConcurrentLinkedQueue、SynchronousQueue(公平模式下转交元素)、LinkedBlockingQueue(阻塞Queue的基本方法)的超集。而且LinkedTransferQueue更好用,因为它不仅仅综合了这几个类的功能,同时也提供了更高效的实现。

简单用法介绍------------------------------------------------------------------------------------------------------

存:

put();   放元素进去队列,注意队列是可以无限长的

add();   同上

transfer();  这个是重点,如果队列中有人发现有人在等,则直接给那个人(有一个参数waiter指定了在等的线程),如果没人在等,就放进队列

取:

poll();  立即返回,如果没有元素就是空

take(); 如果没有元素,那就等

参考资料:https://www.cnblogs.com/rockman12352/p/3790245.html

StringUtils常用方法

public static boolean isEmpty(String str):判断某字符串是否为空,为空的标准是 str==null 或 str.length()==0

public static boolean isBlank(String str):判断某字符串是否为空或长度为0或由空白符(whitespace) 构成 

StringUtils.substringAfterLast(string1,string2 ):将string1中string2最后出现的位置向后截取。

 String uri="/forebuy"

 String method = StringUtils.substringAfterLast(uri,"/fore" );

 answer:method=="buy"

参考文章:https://www.cnblogs.com/guiblog/p/7986410.html

String.format("start %d > end %d", start, end)

Objects

Objects.isNull(x)    //equals  x==null
Objects.nonNull(...)  //equals x!=null

Predicate和Consumer

接口表示一个接受单个输入参数并且没有返回值的操作。不像其他函数式接口,Consumer接口期望执行带有副作用的操作(译者注:Consumer的操作可能会更改输入参数的内部状态)。

Consumer接口中有2个方法,有且只有一个声明为accept(T t)的方法,接收一个输入参数并且没有返回值。

Predicate和Consumer接口的test()和accept()方法都接受一个泛型参数。不同的是test()方法进行某些逻辑判断并返回一个boolean值,而accept()接受并改变某个对象的内部值。

参考文章:http://ifeve.com/predicate-and-consumer-interface-in-java-util-function-package-in-java-8/

LoadingCache

参考文章:https://www.cnblogs.com/licunzhi/p/8818838.html

Pair

参考文章:https://blog.youkuaiyun.com/neweastsun/article/details/80294811

线程命名

这点得反复强调。对正在运行的JVM进行线程转储(thread dump)或者调试时,线程池默认的命名机制是pool-N-thread-M,这里N是线程池的序号(每新创建一个线程池,这个N都会加一),而M是池 里线程的序号。比方说,pool-2-thread-3指的是JVM生命周期中第二个线程池里的第三个线程。参考这里 Executors.defaultThreadFactory()] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent /Executors.html#defaultThreadFactory--)。这样的名字表述性不佳。由于JDK将命名机制都隐藏在 [ThreadFactory 里面,这使得要正确地命名线程得稍微费点工夫。所幸的是Guava提供了这么一个工具类:

import com.google.common.util.concurrent.ThreadFactoryBuilder;
 
final ThreadFactory threadFactory = new ThreadFactoryBuilder()
        .setNameFormat("Orders-%d")
        .setDaemon(true)
        .build();
final ExecutorService executorService = Executors.newFixedThreadPool(10, threadFactory);


workers = Executors.newSingleThreadExecutor(
                new ThreadFactoryBuilder().setNameFormat("kafka-data-transfer, %d").build());

参考文章:http://arcticfox9902.iteye.com/blog/1114440

LoadingCache

参考文章:https://www.jianshu.com/p/f4b99b70bd76

Java中RunTime.getRunTime().addShutdownHook用法

 Runtime.getRuntime().addShutdownHook(Thread hook);

这个方法的含义说明:这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁等操作。

参考文章:https://www.cnblogs.com/chasewade/p/3387423.html

Hase

参考资料:https://www.cnblogs.com/caiyisen/p/7424177.html

                  http://blog.51cto.com/xpleaf/2086957

AtomicReference 原子引用

赋值操作不是线程安全的。若想不用锁来实现,可以用AtomicReference<V>这个类,实现对象引用的原子更新。

使用场景:一个线程使用student对象,另一个线程负责定时读表,更新这个对象。那么就可以用AtomicReference这个类。java.util.concurrent.atomic.AtomicReference<V>
类的名字。
2.常用方法

java.util.concurrent.atomic.AtomicReference.AtomicReference(V initialValue)   //构造函数。

V java.util.concurrent.atomic.AtomicReference.get() //返回当前的引用。

boolean java.util.concurrent.atomic.AtomicReference.compareAndSet(V expect, V update)  //如果当前值与给定的expect相等,(注意是引用相等而不是equals()相等),更新为指定的update值。

V java.util.concurrent.atomic.AtomicReference.getAndSet(V newValue)  //原子地设为给定值并返回旧值。

void java.util.concurrent.atomic.AtomicReference.set(V newValue)  //注意此方法不是原子的

 参考文章: https://blog.youkuaiyun.com/chuchus/article/details/50801993 

Log4j的使用:https://www.cnblogs.com/deng-cc/p/6739419.html

FastDateFormat使用

private static final FastDateFormat gcDateFormat = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    private static final FastDateFormat minuteFormat = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm");

//调用写入时间,得到long类型
public static long parseDate(String date) {
        try {
            return gcDateFormat.parse(date).getTime();
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}

LOG4J和Predicate和Consumer练习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值