[jdk8] jdk8函数式编程思考

零、导读

(一)文章中心

我用jdk8已经半年多了,基本操作已经入门,但是jdk8魅力并非集合流以及线程等等,它要传输的更加是编程方式的改变,要知道像javascript是可以传递函数的,而在以前的jdk版本中,虽然可以但是并非十分的方便。现在官方已经可以通过传递行为的方式传递给函数,让编程中可以对一些基本的动作更加一步的抽象,而不需要写更多的重复代码。

文章中会提到常用的几个函数式接口,这几个接口无疑带来了很多方便。像之前用jdk8的时候写的第一篇文章《[jdk8]Lambda、JDK8接口使用、自定义函数接口》的时候还懵懵懂懂这个过程,所以这篇算是响应第一篇的使用了。

Continue reading “[jdk8] jdk8函数式编程思考”

[多线程]Java多线程05_Lock类使用

一. Lock介绍

jdk5中新增了Lock对象,可以用来更加精确的控制线程之间的安全以及线程之间的通讯。

二. ReentrantLock类的使用

通过生产者和消费者来示范ReentrantLock类的使用,这个例子中包含了Lock加锁解锁的使用以及线程之间的通讯

通过创建5个生产者和5个消费者,对同一个资源进行操作,一个生产者一次生产5个,一个消费者一次生产一个。

Continue reading “[多线程]Java多线程05_Lock类使用”

[多线程]Java多线程04_多个线程协作以及线程私有数据

一、线程间的通讯

前面说完了线程的工作、线程的安全等等,那么多个线程的协同工作,线程之间的通讯就是接下来的话题了。

线程之间的等待通知,简而言之就是一个线程做完了自己该做的一件事情,然后通知另外一个线程继续需要的业务操作,实现一个任务由多个线程异步进行从而提升软件性能。

$seq
线程A->线程A: 执行任务
Note right of 线程B: 等待线程A执行完成通知
线程A->线程B: 执行完成,通知线程B启动
Note right of 线程B: 继续执行任务
$

Continue reading “[多线程]Java多线程04_多个线程协作以及线程私有数据”

[多线程]Java多线程03_线程同步及可见性

一、线程安全问题

线程安全问题是个经典的问题,主要涉及的方面就是对变量的修改以及读取。因为修改读取并不是一步完成,而计算机在切换线程的时候也没有清楚哪个时候可以切换,这时候就需要程序来给计算机指定道路说,你什么时候可以切换什么时候不行。特别是在对值修改的过程中,是不能够切换到读取线程的,要不然会出现脏读(即数据的错误)的问题。而Java对线程安全的控制主要是synchronized以及Lock锁。

关于变量安全控制的问题,我们现在大部分说到的变量安全问题均是类全局变量的安全问题,方法内部的局部变量,因为jvm在执行一个方法的时候都会进行线程栈之间的隔离,所以一个线程中对一个变量的修改创建并不会到另外一个线程对变量的修改创建。

Continue reading “[多线程]Java多线程03_线程同步及可见性”

[多线程]Java多线程01_初入门

1. 线程与进程的区别

进程 > 线程

进程:相当于启动一个软件,就启动了一个进程。当启动了QQ以及微信,那么这两个不同软件运行的独立任务就是两个不同的进程

线程:一个软件了里面,为了进行多个任务,就需要多个线程来协同工作,以可以尽可能多的使用计算机的资源。

注:由于CPU在线程、进程之间切换非常快,所以给人一种这些进程、线程都是在一起工作的错觉。

Continue reading “[多线程]Java多线程01_初入门”

[jdk8] jdk8 多线程处理的使用

github地址:jdk8-future

一、Future接口

Future是jdk5的时候被引入的,目的是为了把耗时的操作解放出来,可以同时使用多核的优势进行并行处理。比如,我有一个页面,需要从多方获取数据比如说从Twitter和Facebook获取数据,然后一起渲染的页面上。这时候如果等待Twitter的数据获取完在获取FB的数据,就显得比较慢了,这时候可以通过Future来让这两个任务并行处理。

Continue reading “[jdk8] jdk8 多线程处理的使用”

[jdk8]jdk8并行处理数据

一、简述

JDK8为了让处理大数据量集合更快速,使用了并行的形式来进行处理。在上面的例子中我们也看到了,如果我们需要一个并行流的话,只要对一个集合打开parallelStream即可。在JDK7以前,想要对一个集合进行并行处理似乎是一件困难的事情。所以这一篇文章我们可以看看JDK8是怎么实现并行处理的。

Continue reading “[jdk8]jdk8并行处理数据”

[jdk8]jdk8——流的收集器

之前写了JDK8集合流的入门以及筛选,也就是集合流使用的打开和中间操作。这次带来的是不同的收集数据的方式。

本节代码GitHub地址:jdk8 收集器

一、准备:

还是老规矩,使用菜单进行示例。(代码的话建议拷贝这部分)

二、收集器简介

收集器即收集东西的容器,它用于使用集合流的时候的终端操作,即我们在日常的业务逻辑中把流进行过滤也好,进行筛选也好,然后我们总该要有一个容器可以存放这些过滤后的元素。这时候的收集器就派上用场了。如代码所示一个最简单的收集器的使用实例(当然我感觉平时应该没人这么无聊)

Continue reading “[jdk8]jdk8——流的收集器”

[jdk8]jdk8——流的增强、流的中间操作以及终端操作

示例代码:jdk8-stream

零、准备

这一个部分,我们准备了菜单。包含菜单名字、是否是素食、卡路里数量以及菜单类型四个属性,使用了Lombok自动加入GETTER&SETTER这些元素。

package cn.liweidan.pojo;

import lombok.*;

/**
 * <p>Desciption:</p>
 * CreateTime : 2017/6/6 下午2:51
 * Author : Weidan
 * Version : V1.0
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@ToString
public class Dish {

    /** 名字 */
    private String name;
    /** 是否素食 */
    private boolean vegetarain;
    /** 卡路里 */
    private int colories;
    /** 类型 */
    private Type type;

    public enum Type {MEAT, FISH, OTHER};

}

并且准备了一些菜单。

package cn.liweidan.utils;

import cn.liweidan.pojo.Dish;

import java.util.Arrays;
import java.util.List;

/**
 * <p>Desciption:</p>
 * CreateTime : 2017/6/6 下午2:55
 * Author : Weidan
 * Version : V1.0
 */
public class DishUtils {

    public static List<Dish> getDishes(){
        return Arrays.asList(new Dish("pork", false, 800, Dish.Type.MEAT),
                new Dish("beef", false, 700, Dish.Type.MEAT),
                new Dish("chicken", false, 400, Dish.Type.MEAT),
                new Dish("french fries", true, 530, Dish.Type.OTHER),
                new Dish("rice", true, 350, Dish.Type.OTHER),
                new Dish("season fruit", true, 120, Dish.Type.OTHER),
                new Dish("pizza", true, 550, Dish.Type.OTHER),
                new Dish("prawns", false, 300, Dish.Type.FISH),
                new Dish("salmon", false, 450, Dish.Type.FISH));
    }

}

一、集合的处理

在jdk7以及以前,如果我们需要从一个集合中取出一个符合我们所需要条件的变量的时候,就需要去遍历这个元素中的每一个元素,然后使用if语句进行判断,如果符合我们所要的条件,就把这个元素放入另外一个集合中去。

Continue reading “[jdk8]jdk8——流的增强、流的中间操作以及终端操作”