@NonNull
    public static List<TtlRunnable> gets(@Nullable Collection<? extends Runnable> tasks, boolean releaseTtlValueReferenceAfterRun, boolean idempotent) {
        if (tasks == null) return Collections.emptyList();

        List<TtlRunnable> copy = new ArrayList<>();
        for (Runnable task : tasks) {
            copy.add(TtlRunnable.get(task, releaseTtlValueReferenceAfterRun, idempotent));
        }
        return copy;
    }
wrap input {@link Runnable} Collection to {@link TtlRunnable} Collection.

@param tasks                            task to be wrapped. if input is {@code null}, return {@code null}.
@param releaseTtlValueReferenceAfterRun release TTL value reference after run, avoid memory leak even if {@link TtlRunnable} is referred.
@param idempotent                       is idempotent mode or not. if {@code true}, just return input {@link Runnable} when it's {@link TtlRunnable},
                                        otherwise throw {@link IllegalStateException}.
                                        <B><I>Caution</I></B>: {@code true} will cover up bugs! <b>DO NOT</b> set, only when you know why.
@return wrapped tasks
@throws IllegalStateException when input is {@link TtlRunnable} already and not idempotent.
ttl2-compatible/src/main/java/com/alibaba/ttl/TtlRunnable.java