Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
阿啄debugIT
transmittable-thread-local
提交
c61f6b11
T
transmittable-thread-local
项目概览
阿啄debugIT
/
transmittable-thread-local
与 Fork 源项目一致
从无法访问的项目Fork
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
transmittable-thread-local
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
c61f6b11
编写于
11月 12, 2018
作者:
oldratlee
🔥
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add unwrap util method for TtlRunnable/TtlCallable/TtlTimerTask
上级
c6115448
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
190 addition
and
7 deletion
+190
-7
src/main/java/com/alibaba/ttl/TtlCallable.java
src/main/java/com/alibaba/ttl/TtlCallable.java
+36
-0
src/main/java/com/alibaba/ttl/TtlRunnable.java
src/main/java/com/alibaba/ttl/TtlRunnable.java
+36
-0
src/main/java/com/alibaba/ttl/TtlTimerTask.java
src/main/java/com/alibaba/ttl/TtlTimerTask.java
+42
-6
src/main/java/com/alibaba/ttl/threadpool/TtlExecutors.java
src/main/java/com/alibaba/ttl/threadpool/TtlExecutors.java
+1
-1
src/test/java/com/alibaba/ttl/TtlCallableTest.kt
src/test/java/com/alibaba/ttl/TtlCallableTest.kt
+18
-0
src/test/java/com/alibaba/ttl/TtlRunnableTest.kt
src/test/java/com/alibaba/ttl/TtlRunnableTest.kt
+18
-0
src/test/java/com/alibaba/ttl/TtlTimerTaskTest.kt
src/test/java/com/alibaba/ttl/TtlTimerTaskTest.kt
+39
-0
未找到文件。
src/main/java/com/alibaba/ttl/TtlCallable.java
浏览文件 @
c61f6b11
...
...
@@ -172,4 +172,40 @@ public final class TtlCallable<V> implements Callable<V>, TtlEnhanced {
}
return
copy
;
}
/**
* Unwrap {@link TtlCallable} to the original/underneath one.
* <p>
* this method is {@code null}-safe, when input {@code Callable} parameter is {@code null}, return {@code null};
* if input {@code Callable} parameter is not a {@link TtlCallable} just return input {@code Callable}.
*
* @since 2.10.2
*/
@Nullable
public
static
<
T
>
Callable
<
T
>
unwrap
(
@Nullable
Callable
<
T
>
callable
)
{
if
(!(
callable
instanceof
TtlCallable
))
return
callable
;
else
return
((
TtlCallable
<
T
>)
callable
).
getCallable
();
}
/**
* Unwrap {@link TtlCallable} to the original/underneath one.
* <p>
* Invoke {@link #unwrap(Callable)} for each element in input collection.
* <p>
* This method is {@code null}-safe, when input {@code Callable} parameter is {@code null}, return a empty list.
*
* @see #unwrap(Callable)
* @since 2.10.2
*/
@Nonnull
public
static
<
T
>
List
<
Callable
<
T
>>
unwraps
(
@Nullable
Collection
<?
extends
Callable
<
T
>>
tasks
)
{
if
(
null
==
tasks
)
return
Collections
.
emptyList
();
List
<
Callable
<
T
>>
copy
=
new
ArrayList
<
Callable
<
T
>>();
for
(
Callable
<
T
>
task
:
tasks
)
{
if
(!(
task
instanceof
TtlCallable
))
copy
.
add
(
task
);
else
copy
.
add
(((
TtlCallable
<
T
>)
task
).
getCallable
());
}
return
copy
;
}
}
src/main/java/com/alibaba/ttl/TtlRunnable.java
浏览文件 @
c61f6b11
...
...
@@ -176,4 +176,40 @@ public final class TtlRunnable implements Runnable, TtlEnhanced {
}
return
copy
;
}
/**
* Unwrap {@link TtlRunnable} to the original/underneath one.
* <p>
* this method is {@code null}-safe, when input {@code Runnable} parameter is {@code null}, return {@code null};
* if input {@code Runnable} parameter is not a {@link TtlRunnable} just return input {@code Runnable}.
*
* @since 2.10.2
*/
@Nullable
public
static
Runnable
unwrap
(
@Nullable
Runnable
runnable
)
{
if
(!(
runnable
instanceof
TtlRunnable
))
return
runnable
;
else
return
((
TtlRunnable
)
runnable
).
getRunnable
();
}
/**
* Unwrap {@link TtlRunnable} to the original/underneath one for collection.
* <p>
* Invoke {@link #unwrap(Runnable)} for each element in input collection.
* <p>
* This method is {@code null}-safe, when input {@code Runnable} parameter is {@code null}, return a empty list.
*
* @see #unwrap(Runnable)
* @since 2.10.2
*/
@Nonnull
public
static
List
<
Runnable
>
unwraps
(
@Nullable
Collection
<?
extends
Runnable
>
tasks
)
{
if
(
null
==
tasks
)
return
Collections
.
emptyList
();
List
<
Runnable
>
copy
=
new
ArrayList
<
Runnable
>();
for
(
Runnable
task
:
tasks
)
{
if
(!(
task
instanceof
TtlRunnable
))
copy
.
add
(
task
);
else
copy
.
add
(((
TtlRunnable
)
task
).
getRunnable
());
}
return
copy
;
}
}
src/main/java/com/alibaba/ttl/TtlTimerTask.java
浏览文件 @
c61f6b11
...
...
@@ -2,7 +2,7 @@ package com.alibaba.ttl;
import
javax.annotation.Nonnull
;
import
javax.annotation.Nullable
;
import
java.util.
TimerTask
;
import
java.util.
*
;
import
java.util.concurrent.atomic.AtomicReference
;
import
static
com
.
alibaba
.
ttl
.
TransmittableThreadLocal
.
Transmitter
.*;
...
...
@@ -81,7 +81,7 @@ public final class TtlTimerTask extends TimerTask implements TtlEnhanced {
}
/**
* Factory method, wrap input {@link
Runnable
} to {@link TtlTimerTask}.
* Factory method, wrap input {@link
TimerTask
} to {@link TtlTimerTask}.
* <p>
* This method is idempotent.
*
...
...
@@ -94,12 +94,12 @@ public final class TtlTimerTask extends TimerTask implements TtlEnhanced {
}
/**
* Factory method, wrap input {@link
Runnable
} to {@link TtlTimerTask}.
* Factory method, wrap input {@link
TimerTask
} to {@link TtlTimerTask}.
* <p>
* This method is idempotent.
*
* @param timerTask input {@link TimerTask}
* @param releaseTtlValueReferenceAfterRun release TTL value reference after run, avoid memory leak even if {@link Ttl
Runnable
} is referred.
* @param releaseTtlValueReferenceAfterRun release TTL value reference after run, avoid memory leak even if {@link Ttl
TimerTask
} is referred.
* @return Wrapped {@link TimerTask}
*/
@Nullable
...
...
@@ -108,12 +108,12 @@ public final class TtlTimerTask extends TimerTask implements TtlEnhanced {
}
/**
* Factory method, wrap input {@link
Runnable
} to {@link TtlTimerTask}.
* Factory method, wrap input {@link
TimerTask
} to {@link TtlTimerTask}.
* <p>
* This method is idempotent.
*
* @param timerTask input {@link TimerTask}
* @param releaseTtlValueReferenceAfterRun release TTL value reference after run, avoid memory leak even if {@link Ttl
Runnable
} is referred.
* @param releaseTtlValueReferenceAfterRun release TTL value reference after run, avoid memory leak even if {@link Ttl
TimerTask
} is referred.
* @param idempotent is idempotent or not. {@code true} will cover up bugs! <b>DO NOT</b> set, only when you know why.
* @return Wrapped {@link TimerTask}
*/
...
...
@@ -128,4 +128,40 @@ public final class TtlTimerTask extends TimerTask implements TtlEnhanced {
}
return
new
TtlTimerTask
(
timerTask
,
releaseTtlValueReferenceAfterRun
);
}
/**
* Unwrap {@link TtlTimerTask} to the original/underneath one.
* <p>
* this method is {@code null}-safe, when input {@code TimerTask} parameter is {@code null}, return {@code null};
* if input {@code TimerTask} parameter is not a {@link TtlTimerTask} just return input {@code TimerTask}.
*
* @since 2.10.2
*/
@Nullable
public
static
TimerTask
unwrap
(
@Nullable
TimerTask
timerTask
)
{
if
(!(
timerTask
instanceof
TtlTimerTask
))
return
timerTask
;
else
return
((
TtlTimerTask
)
timerTask
).
getTimerTask
();
}
/**
* Unwrap {@link TtlTimerTask} to the original/underneath one.
* <p>
* Invoke {@link #unwrap(TimerTask)} for each element in input collection.
* <p>
* This method is {@code null}-safe, when input {@code TimerTask} parameter is {@code null}, return a empty list.
*
* @see #unwrap(TimerTask)
* @since 2.10.2
*/
@Nonnull
public
static
List
<
TimerTask
>
unwraps
(
@Nullable
Collection
<?
extends
TimerTask
>
tasks
)
{
if
(
null
==
tasks
)
return
Collections
.
emptyList
();
List
<
TimerTask
>
copy
=
new
ArrayList
<
TimerTask
>();
for
(
TimerTask
task
:
tasks
)
{
if
(!(
task
instanceof
TtlTimerTask
))
copy
.
add
(
task
);
else
copy
.
add
(((
TtlTimerTask
)
task
).
getTimerTask
());
}
return
copy
;
}
}
src/main/java/com/alibaba/ttl/threadpool/TtlExecutors.java
浏览文件 @
c61f6b11
...
...
@@ -138,7 +138,7 @@ public final class TtlExecutors {
}
/**
* check the {@link ThreadFactory} is
{@link DisableInheritableThreadFactory} or not.
* check the {@link ThreadFactory} is {@link DisableInheritableThreadFactory} or not.
*
* @see DisableInheritableThreadFactory
* @since 2.10.0
...
...
src/test/java/com/alibaba/ttl/TtlCallableTest.kt
浏览文件 @
c61f6b11
...
...
@@ -168,6 +168,24 @@ class TtlCallableTest {
assertThat
(
callList
[
3
],
instanceOf
(
TtlCallable
::
class
.
java
))
}
@Test
fun
test_unwrap
()
{
assertNull
(
TtlCallable
.
unwrap
<
String
>(
null
))
val
callable
=
Callable
{
"hello"
}
val
ttlCallable
=
TtlCallable
.
get
(
callable
)
assertSame
(
callable
,
TtlCallable
.
unwrap
(
callable
))
assertSame
(
callable
,
TtlCallable
.
unwrap
(
ttlCallable
))
assertEquals
(
listOf
(
callable
),
TtlCallable
.
unwraps
(
listOf
(
callable
)))
assertEquals
(
listOf
(
callable
),
TtlCallable
.
unwraps
(
listOf
(
ttlCallable
)))
assertEquals
(
listOf
(
callable
,
callable
),
TtlCallable
.
unwraps
(
listOf
(
ttlCallable
,
callable
)))
assertEquals
(
listOf
<
Callable
<
String
>>(),
TtlCallable
.
unwraps
<
String
>(
null
))
}
companion
object
{
private
val
executorService
=
Executors
.
newFixedThreadPool
(
3
).
also
{
expandThreadPool
(
it
)
}
...
...
src/test/java/com/alibaba/ttl/TtlRunnableTest.kt
浏览文件 @
c61f6b11
...
...
@@ -294,6 +294,24 @@ class TtlRunnableTest {
assertThat
(
taskList
[
3
],
instanceOf
(
TtlRunnable
::
class
.
java
))
}
@Test
fun
test_unwrap
()
{
assertNull
(
TtlRunnable
.
unwrap
(
null
))
val
runnable
=
Runnable
{}
val
ttlRunnable
=
TtlRunnable
.
get
(
runnable
)
assertSame
(
runnable
,
TtlRunnable
.
unwrap
(
runnable
))
assertSame
(
runnable
,
TtlRunnable
.
unwrap
(
ttlRunnable
))
assertEquals
(
listOf
(
runnable
),
TtlRunnable
.
unwraps
(
listOf
(
runnable
)))
assertEquals
(
listOf
(
runnable
),
TtlRunnable
.
unwraps
(
listOf
(
ttlRunnable
)))
assertEquals
(
listOf
(
runnable
,
runnable
),
TtlRunnable
.
unwraps
(
listOf
(
ttlRunnable
,
runnable
)))
assertEquals
(
listOf
<
Runnable
>(),
TtlRunnable
.
unwraps
(
null
))
}
companion
object
{
private
val
executorService
=
Executors
.
newFixedThreadPool
(
3
).
also
{
expandThreadPool
(
it
)
}
...
...
src/test/java/com/alibaba/ttl/TtlTimerTaskTest.kt
0 → 100644
浏览文件 @
c61f6b11
package
com.alibaba.ttl
import
org.junit.Assert.*
import
org.junit.Test
import
java.util.*
class
TtlTimerTaskTest
{
@Test
fun
test_get
()
{
assertNull
(
TtlTimerTask
.
get
(
null
))
val
timerTask
=
object
:
TimerTask
()
{
override
fun
run
()
{}
}
val
ttlTimerTask
=
TtlTimerTask
.
get
(
timerTask
)
assertTrue
(
ttlTimerTask
is
TtlTimerTask
)
}
@Test
fun
test_unwrap
()
{
assertNull
(
TtlTimerTask
.
unwrap
(
null
))
val
timerTask
=
object
:
TimerTask
()
{
override
fun
run
()
{}
}
val
ttlTimerTask
=
TtlTimerTask
.
get
(
timerTask
)
assertSame
(
timerTask
,
TtlTimerTask
.
unwrap
(
timerTask
))
assertSame
(
timerTask
,
TtlTimerTask
.
unwrap
(
ttlTimerTask
))
assertEquals
(
listOf
(
timerTask
),
TtlTimerTask
.
unwraps
(
listOf
(
timerTask
)))
assertEquals
(
listOf
(
timerTask
),
TtlTimerTask
.
unwraps
(
listOf
(
ttlTimerTask
)))
assertEquals
(
listOf
(
timerTask
,
timerTask
),
TtlTimerTask
.
unwraps
(
listOf
(
ttlTimerTask
,
timerTask
)))
assertEquals
(
listOf
<
TimerTask
>(),
TtlTimerTask
.
unwraps
(
null
))
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录