Categories:
Audio (13)
Biotech (29)
Bytecode (36)
Database (77)
Framework (7)
Game (7)
General (507)
Graphics (53)
I/O (35)
IDE (2)
JAR Tools (101)
JavaBeans (21)
JDBC (121)
JDK (426)
JSP (20)
Logging (108)
Mail (58)
Messaging (8)
Network (84)
PDF (97)
Report (7)
Scripting (84)
Security (32)
Server (121)
Servlet (26)
SOAP (24)
Testing (54)
Web (15)
XML (309)
Collections:
Other Resources:
Apache Commons Lang v3 Source Code Files
Apache Commons Lang 3 is the 3rd version of Apache Commons Lang, which provides a host of helper utilities for the java.lang API.
Apache Commons Lang 3 Source Code files are provided in both binary packge (commons-lang3-3.12.0-bin.zip) and source package (commons-lang3-3.12.0-src.zip). You can download them at Apache Commons Lang Website.
Apache Commons Lang 3 Source Code has no dependencies and is compatible with Java 8 and newer versions. You can compile it to generate your own version of Apache Commons Lang 3 JAR file.
You can also browse the source code below:
✍: FYIcenter
⏎ org/apache/commons/lang3/concurrent/Memoizer.java
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.lang3.concurrent; import java.util.concurrent.Callable; import java.util.concurrent.CancellationException; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; /** * <p> * Definition of an interface for a wrapper around a calculation that takes a * single parameter and returns a result. The results for the calculation will * be cached for future requests. * </p> * <p> * This is not a fully functional cache, there is no way of limiting or removing * results once they have been generated. However, it is possible to get the * implementation to regenerate the result for a given parameter, if an error * was thrown during the previous calculation, by setting the option during the * construction of the class. If this is not set the class will return the * cached exception. * </p> * <p> * Thanks should go to Brian Goetz, Tim Peierls and the members of JCP JSR-166 * Expert Group for coming up with the original implementation of the class. It * was also published within Java Concurrency in Practice as a sample. * </p> * * @param <I> * the type of the input to the calculation * @param <O> * the type of the output of the calculation * * @since 3.6 */ public class Memoizer<I, O> implements Computable<I, O> { private final ConcurrentMap<I, Future<O>> cache = new ConcurrentHashMap<>(); private final Computable<I, O> computable; private final boolean recalculate; /** * <p> * Constructs a Memoizer for the provided Computable calculation. * </p> * <p> * If a calculation is thrown an exception for any reason, this exception * will be cached and returned for all future calls with the provided * parameter. * </p> * * @param computable * the computation whose results should be memorized */ public Memoizer(final Computable<I, O> computable) { this(computable, false); } /** * <p> * Constructs a Memoizer for the provided Computable calculation, with the * option of whether a Computation that experiences an error should * recalculate on subsequent calls or return the same cached exception. * </p> * * @param computable * the computation whose results should be memorized * @param recalculate * determines whether the computation should be recalculated on * subsequent calls if the previous call failed */ public Memoizer(final Computable<I, O> computable, final boolean recalculate) { this.computable = computable; this.recalculate = recalculate; } /** * <p> * This method will return the result of the calculation and cache it, if it * has not previously been calculated. * </p> * <p> * This cache will also cache exceptions that occur during the computation * if the {@code recalculate} parameter is the constructor was set to * {@code false}, or not set. Otherwise, if an exception happened on the * previous calculation, the method will attempt again to generate a value. * </p> * * @param arg * the argument for the calculation * @return the result of the calculation * @throws InterruptedException * thrown if the calculation is interrupted */ @Override public O compute(final I arg) throws InterruptedException { while (true) { Future<O> future = cache.get(arg); if (future == null) { final Callable<O> eval = () -> computable.compute(arg); final FutureTask<O> futureTask = new FutureTask<>(eval); future = cache.putIfAbsent(arg, futureTask); if (future == null) { future = futureTask; futureTask.run(); } } try { return future.get(); } catch (final CancellationException e) { cache.remove(arg, future); } catch (final ExecutionException e) { if (recalculate) { cache.remove(arg, future); } throw launderException(e.getCause()); } } } /** * <p> * This method launders a Throwable to either a RuntimeException, Error or * any other Exception wrapped in an IllegalStateException. * </p> * * @param throwable * the throwable to laundered * @return a RuntimeException, Error or an IllegalStateException */ private RuntimeException launderException(final Throwable throwable) { if (throwable instanceof RuntimeException) { return (RuntimeException) throwable; } else if (throwable instanceof Error) { throw (Error) throwable; } else { throw new IllegalStateException("Unchecked exception", throwable); } } }
⏎ org/apache/commons/lang3/concurrent/Memoizer.java
Or download all of them as a single archive file:
File name: commons-lang3-3.12.0-sources.jar File size: 651724 bytes Release date: 2020-01-22 Download
⇒ Download and Install commons-lang3-3.8.1-bin.zip
⇐ Download Apache Commons Lang v3 Source Package
2022-10-19, 150707👍, 3💬
Popular Posts:
Rhino JavaScript Java Library is an open-source implementation of JavaScript written entirely in Jav...
What Is poi-scratchpad-3.5.jar? poi-scratchpad-3.5.jar is one of the JAR files for Apache POI 3.5, w...
Snappy-Java is a Java port of the "snappy", a fast C++ compresser/decompresser developed by Google. ...
Jettison is a collection of Java APIs (like STaX and DOM) which read and write JSON. This allows nea...
JSP(tm) Standard Tag Library 1.0 implementation - Jakarta Taglibs hosts the Standard Taglib 1.0, an ...