diff --git a/java-base-demo/src/main/java/com/jay/extend/Employee.java b/java-base-demo/src/main/java/com/jay/extend/Employee.java deleted file mode 100644 index 605ff23..0000000 --- a/java-base-demo/src/main/java/com/jay/extend/Employee.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.jay.extend; - -/** - * Created by xiang.wei on 2018/1/28 - * - * @author xiang.wei - */ -public class Employee { - private String name; - private int salary; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getSalary() { - return salary; - } - - public void setSalary(int salary) { - this.salary = salary; - } - - @Override - public boolean equals(Object other) { - return other != null - && getClass() == other.getClass(); - } -} diff --git a/java-base-demo/src/main/java/com/jay/extend/MessageTest.java b/java-base-demo/src/main/java/com/jay/extend/MessageTest.java new file mode 100644 index 0000000..1db05b5 --- /dev/null +++ b/java-base-demo/src/main/java/com/jay/extend/MessageTest.java @@ -0,0 +1,76 @@ +package com.jay.extend; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.RecursiveAction; + + +public class MessageTest { + public static void main(String[] args) { + List batchMessageList = new ArrayList<>(); + //初始化测试数据 + for (int i = 0; i < 110; i++) { + String message="消息"+i; + batchMessageList.add(message); + } + //1. 定义四个任务,每个任务发送25条 + //2. 然后归并结果 + ForkJoinPool forkJoinPool = new ForkJoinPool(5); + //超过100条就只发送前100条 + if (batchMessageList.size() > 100) { + batchMessageList = batchMessageList.subList(0, 100); + } + long startTime = System.currentTimeMillis(); + SendTask sendTask = new SendTask(0,batchMessageList.size(),batchMessageList); + forkJoinPool.invoke(sendTask); + System.out.println("***********消息发送总耗时="+(System.currentTimeMillis()-startTime)); + } + + //单条发送的接口 + public static void send(String message) { + try { + Thread.sleep(2); + System.out.println("***********发送了="+message); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + public static void batchSend(int start, int end, List messageList) { + for (int i = start; i < end; i++) { + send(messageList.get(i)); + } + } + + static class SendTask extends RecursiveAction { + private int start; + private int end; + private List list; + + public SendTask(int start, int end, List list) { + this.start = start; + this.end = end; + this.list = list; + } + + @Override + protected void compute() { + if (start > end) { + return; + } + if (end - start <= 20) { + batchSend(start, end,list); + } else { + int mid = (start + end) / 2; + SendTask rightTask = new SendTask(start, mid,list); + SendTask leftTask = new SendTask(mid + 1, end, list); + invokeAll(rightTask, leftTask); + leftTask.join(); + rightTask.join(); + + } + + } + } +} diff --git a/java-base-demo/src/main/java/com/jay/extend/MessageTest2.java b/java-base-demo/src/main/java/com/jay/extend/MessageTest2.java new file mode 100644 index 0000000..ac4d722 --- /dev/null +++ b/java-base-demo/src/main/java/com/jay/extend/MessageTest2.java @@ -0,0 +1,14 @@ +package com.jay.extend; + +/** + * @author xiang.wei + * @date 2020/6/15 10:23 PM + */ +public class MessageTest2 { + + public static void main(String[] args) { + + + } + +} diff --git a/java-base-demo/src/main/java/com/jay/extend/TripleTest2.java b/java-base-demo/src/main/java/com/jay/extend/TripleTest2.java index fbd361f..b0c77eb 100644 --- a/java-base-demo/src/main/java/com/jay/extend/TripleTest2.java +++ b/java-base-demo/src/main/java/com/jay/extend/TripleTest2.java @@ -5,18 +5,18 @@ * * @author xiang.wei */ -public class TripleTest2 { - public static void main(String[] args) { - Employee outEmployee = new Employee(); - outEmployee.setName("测试"); - call(outEmployee); - System.out.println("employee:"+outEmployee.getName()); - } - - public static void call(Employee inEmployee) { - Employee employee = new Employee(); - employee.setName("cba"); - inEmployee.setName("abc"); - inEmployee = employee; - } -} +//public class TripleTest2 { +// public static void main(String[] args) { +// MessageTest outEmployee = new MessageTest(); +// outEmployee.setName("测试"); +// call(outEmployee); +// System.out.println("employee:"+outEmployee.getName()); +// } +// +// public static void call(MessageTest inEmployee) { +// MessageTest employee = new MessageTest(); +// employee.setName("cba"); +// inEmployee.setName("abc"); +// inEmployee = employee; +// } +//} diff --git a/java-base-demo/src/main/java/com/jay/skiplist/SkipList.java b/java-base-demo/src/main/java/com/jay/skiplist/SkipList.java new file mode 100644 index 0000000..3642d11 --- /dev/null +++ b/java-base-demo/src/main/java/com/jay/skiplist/SkipList.java @@ -0,0 +1,93 @@ +package com.jay.skiplist; + +import java.util.Random; + +/** + * @author xiang.wei + * @date 2020/8/2 3:51 PM + */ +public class SkipList { + private SkipListNode head, tail; + /** + * 节点总数 + */ + private int nodes; + /** + * 层高 + */ + private int listLevel; + /** + * 随机函数 + */ + private Random random; + /** + * 向上提升一个的概率 + */ + private static final double PROBABILITY = 0.5; + + public SkipList() { + random = new Random(); + clear(); + } + + public void clear() { + head = new SkipListNode(SkipListNode.HEAD_KEY, null); + tail = new SkipListNode(SkipListNode.TAIL_KEY, null); + // TODO: 2020/8/2 + + listLevel = 0; + nodes = 0; + } + + public boolean isEmpty() { + return nodes == 0; + } + + public int size() { + return nodes; + } + + /** + * 在最下面一层,找到要插入的位置前面的那个key + * @param key + * @return + */ + private SkipListNode findNode(int key) { + SkipListNode p = head; + while (true) { + while (p.right.getKey() != SkipListNode.TAIL_KEY + && p.right.getKey() <= key) { + p = p.right; + } + if (p.down != null) { + p = p.down; + } else { + break; + } + } + return p; + } + + /** + * 查询是否存储key,存在则返回该节点,否则返回null + * @param key + * @return + */ + public SkipListNode search(int key) { + SkipListNode p = findNode(key); + if (key == p.getKey()) { + return p; + } else { + return null; + } + } + + public void put(int k, T v) { + SkipListNode p = findNode(k); + //如果key值相同,替换原来的value即可结束 + if (k == p.getKey()) { + p.setValue(v); + return; + } + } +} diff --git a/java-base-demo/src/main/java/com/jay/skiplist/SkipListNode.java b/java-base-demo/src/main/java/com/jay/skiplist/SkipListNode.java new file mode 100644 index 0000000..94052db --- /dev/null +++ b/java-base-demo/src/main/java/com/jay/skiplist/SkipListNode.java @@ -0,0 +1,70 @@ +package com.jay.skiplist; + +/** + * 跳跃表的节点,包括key-value和上下左右4个指针 + * @author xiang.wei + * @date 2020/8/2 3:34 PM + */ +public class SkipListNode { + private int key; + private T value; + /** + * 上下左右 四个指针 + */ + public SkipListNode up,down,left, right; + + /** + * 负无穷 + */ + public static final int HEAD_KEY = Integer.MIN_VALUE; + /** + * 正无穷 + */ + public static final int TAIL_KEY = Integer.MAX_VALUE; + + public SkipListNode(int key, T value) { + this.key = key; + this.value = value; + } + + public int getKey() { + return key; + } + + public void setKey(int key) { + this.key = key; + } + + public T getValue() { + return value; + } + + public void setValue(T value) { + this.value = value; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof SkipListNode)) { + return false; + } + SkipListNode ent; + try { + ent = (SkipListNode) obj; + } catch (Exception e) { + return false; + } + return (ent.getKey() == key) && (ent.getValue() == value); + } + + @Override + public String toString() { + return super.toString(); + } +} diff --git a/java-base-demo/src/main/java/com/jay/skiplist/SkipListTest.java b/java-base-demo/src/main/java/com/jay/skiplist/SkipListTest.java new file mode 100644 index 0000000..4695cee --- /dev/null +++ b/java-base-demo/src/main/java/com/jay/skiplist/SkipListTest.java @@ -0,0 +1,8 @@ +package com.jay.skiplist; + +/** + * @author xiang.wei + * @date 2020/8/2 3:22 PM + */ +public class SkipListTest { +}