Java8的几个实用新特性
1.延迟队列 【Delay Queue】
DelayQueue
吗?它是一种特定类型的 Java 集合,它允许我们根据元素的延迟时间对元素进行排序。老实说,这是一门非常有趣的课。尽管 DelayQueue该类是 Java 集合的成员,但它属于 java.util.concurrent
包。它实现了BlockingQueue
接口。只有当元素的时间到期时,才能从队列中取出元素。getDelay
方法Delayed
。它不必是一个类——你也可以使用 Java Record。public long getDelay(TimeUnit unit) {
long diff = startTime – System.currentTimeMillis();
return unit.convert(diff, TimeUnit.MILLISECONDS);
}
public int compareTo(Delayed o) {
return (int) (this.startTime – ((DelayedEvent) o).startTime);
}
}
final long timeFirst = System.currentTimeMillis() + 10000;
delayQueue.offer(new DelayedEvent(timeFirst, “1”));
log.info(“Done”);
log.info(delayQueue.take().msg());

2.时间格式的天数 【Period of Days in Time Format】
.ofPattern(“B”)
.format(LocalDateTime.now());
System.out.println(s);


3. 印戳锁 【StampedLock】
ReadWriteLock
的替代方法。它允许对读取操作进行乐观锁定。此外,它比 ReentrantReadWriteLock 具有更好的性能。Balance b = new Balance(10000);
Runnable w = () -> {
long stamp = lock.writeLock();
b.setAmount(b.getAmount() + 1000);
System.out.println(“Write: ” + b.getAmount());
lock.unlockWrite(stamp);
};
Runnable r = () -> {
long stamp = lock.tryOptimisticRead();
if (!lock.validate(stamp)) {
stamp = lock.readLock();
try {
System.out.println(“Read: ” + b.getAmount());
} finally {
lock.unlockRead(stamp);
}
} else {
System.out.println(“Optimistic read fails”);
}
};
60000
。for (int i = 0; i < 50; i++) {
executor.submit(w);
executor.submit(r);
}
4. 并行累加器 【Concurrent accumulators】
LongAccumulator
(也有DoubleAccumulator
)使用提供的函数更新值。它允许我们在许多场景中实现无锁算法。当多个线程更新一个公共值时,通常最好使用 AtomicLong
。sum
方法。第二个参数表示我们的累加器的初始值。10000
创建LongAccumulator
,然后从多个线程调用accumulate()
方法。最终结果是什么?Runnable w = () -> balance.accumulate(1000L);
ExecutorService executor = Executors.newFixedThreadPool(50);
for (int i = 0; i < 50; i++) {
executor.submit(w);
}
executor.shutdown();
if (executor.awaitTermination(1000L, TimeUnit.MILLISECONDS))
System.out.println(“Balance: ” + balance.get());
assert balance.get() == 60000L;
5. 十六进制格式 【Hex Format】
HexFormat
类。只需创建一个 HexFormat 实例,然后您就可以格式化例如输入 byte
到十六进制字符串的表。你也可以例如将输入的十六进制字符串解析为字节表,如下所示。byte[] input = new byte[] {127, 0, -50, 105};
String hex = format.formatHex(input);
System.out.println(hex);
byte[] output = format.parseHex(hex);
assert Arrays.compare(input, output) == 0;
6. 数组的二分法检索 【Binary Search for Arrays】
-(insertion point)-1
。此外,binarySearch 方法是在 Java 中查找已排序数组中元素的最简单、最有效的方法。int x = Arrays.binarySearch(t, 3);
assert ~x == 2;
7. 位图 【Bit Set】
??有一种更有效和内存效率更高的方法来实现它。它是 BitSet 类。BitSet 类允许我们存储和操作位数组。与
boolean[] 相比,它消耗的内存少了 8 倍。我们可以对数组执行逻辑操作,例如
and,
or,
xor`。BitSet
实例之一上调用 xor 方法。它将第二个 BitSet实例作为参数。bs1.set(0);
bs1.set(2);
bs1.set(4);
System.out.println(“bs1 : ” + bs1);
BitSet bs2 = new BitSet();
bs2.set(1);
bs2.set(2);
bs2.set(3);
System.out.println(“bs2 : ” + bs2);
bs2.xor(bs1);
System.out.println(“xor: ” + bs2);

8. 移相器 【Phaser】
CountDownLatch
非常相似。但是,它提供了一些附加功能。它允许我们设置在继续执行之前需要等待的动态线程数。使用“Phaser”,定义的线程数需要在屏障上等待,然后才能进入下一步执行。多亏了这一点,我们可以协调执行的多个阶段。phase-1
并调用方法 arriveAndAwaitAdvance()
。Runnable r = () -> {
System.out.println(“phase-0”);
phaser.arriveAndAwaitAdvance();
System.out.println(“phase-1”);
phaser.arriveAndAwaitAdvance();
System.out.println(“phase-2”);
phaser.arriveAndDeregister();
};
ExecutorService executor = Executors.newFixedThreadPool(50);
for (int i = 0; i < 50; i++) {
executor.submit(r);
}

微信赞赏
支付宝扫码领红包