Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
e8448448
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
e8448448
编写于
6月 23, 2011
作者:
C
chegar
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
7021010: java/lang/Thread/ThreadStateTest.java fails intermittently
Reviewed-by: dholmes, alanb, mchung
上级
8616bf83
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
57 addition
and
104 deletion
+57
-104
test/ProblemList.txt
test/ProblemList.txt
+0
-3
test/java/lang/Thread/ThreadStateTest.java
test/java/lang/Thread/ThreadStateTest.java
+57
-101
未找到文件。
test/ProblemList.txt
浏览文件 @
e8448448
...
...
@@ -207,9 +207,6 @@ java/lang/Runtime/exec/SleepyCat.java generic-all
# Times out on solaris sparc -server
java/lang/ThreadLocal/MemoryLeak.java solaris-all
# Windows X64, RuntimeException: MyThread expected to have RUNNABLE but got WAITING
java/lang/Thread/ThreadStateTest.java generic-all
############################################################################
# jdk_management
...
...
test/java/lang/Thread/ThreadStateTest.java
浏览文件 @
e8448448
/*
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2004,
2011,
Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -34,21 +34,16 @@
*/
import
java.util.concurrent.locks.LockSupport
;
import
java.util.concurrent.
Semaphore
;
import
java.util.concurrent.
Phaser
;
public
class
ThreadStateTest
{
// maximum number of retries when checking for thread state.
static
final
int
MAX_RETRY
=
500
;
private
static
boolean
testFailed
=
false
;
static
class
Lock
{
private
String
name
;
Lock
(
String
name
)
{
this
.
name
=
name
;
}
public
String
toString
()
{
return
name
;
}
}
private
static
Lock
globalLock
=
new
Lock
(
"my lock"
);
// used to achieve waiting states
static
final
Object
globalLock
=
new
Object
();
public
static
void
main
(
String
[]
argv
)
{
// Call Thread.getState to force all initialization done
...
...
@@ -102,13 +97,27 @@ public class ThreadStateTest {
System
.
out
.
println
(
"Unexpected exception."
);
testFailed
=
true
;
}
if
(
testFailed
)
throw
new
RuntimeException
(
"TEST FAILED."
);
System
.
out
.
println
(
"Test passed."
);
}
private
static
void
checkThreadState
(
Thread
t
,
Thread
.
State
expected
)
{
Thread
.
State
state
=
t
.
getState
();
// wait for the thread to transition to the expected state.
// There is a small window between the thread checking the state
// and the thread actual entering that state.
Thread
.
State
state
;
int
retryCount
=
0
;
while
((
state
=
t
.
getState
())
!=
expected
&&
retryCount
<
MAX_RETRY
)
{
if
(
state
!=
Thread
.
State
.
RUNNABLE
)
{
throw
new
RuntimeException
(
"Thread not in expected state yet,"
+
" but it should at least be RUNNABLE"
);
}
goSleep
(
10
);
retryCount
++;
}
System
.
out
.
println
(
"Checking thread state "
+
state
);
if
(
state
==
null
)
{
throw
new
RuntimeException
(
t
.
getName
()
+
" expected to have "
+
...
...
@@ -121,13 +130,6 @@ public class ThreadStateTest {
}
}
private
static
String
getLockName
(
Object
lock
)
{
if
(
lock
==
null
)
return
null
;
return
lock
.
getClass
().
getName
()
+
'@'
+
Integer
.
toHexString
(
System
.
identityHashCode
(
lock
));
}
private
static
void
goSleep
(
long
ms
)
{
try
{
Thread
.
sleep
(
ms
);
...
...
@@ -139,7 +141,9 @@ public class ThreadStateTest {
}
static
class
MyThread
extends
Thread
{
private
ThreadExecutionSynchronizer
thrsync
=
new
ThreadExecutionSynchronizer
();
// Phaser to sync between the main thread putting
// this thread into various states
private
Phaser
phaser
=
new
Phaser
(
2
);
MyThread
(
String
name
)
{
super
(
name
);
...
...
@@ -153,12 +157,14 @@ public class ThreadStateTest {
private
final
int
TIMED_PARKED
=
5
;
private
final
int
SLEEPING
=
6
;
private
final
int
TERMINATE
=
7
;
private
int
state
=
RUNNABLE
;
private
volatile
int
state
=
RUNNABLE
;
private
boolean
done
=
false
;
public
void
run
()
{
// Signal main thread to continue.
thrsync
.
signal
();
phaser
.
arriveAndAwaitAdvance
();
while
(!
done
)
{
switch
(
state
)
{
case
RUNNABLE:
{
...
...
@@ -172,7 +178,7 @@ public class ThreadStateTest {
}
case
BLOCKED:
{
// signal main thread.
thrsync
.
signal
();
phaser
.
arrive
();
System
.
out
.
println
(
" myThread is going to block."
);
synchronized
(
globalLock
)
{
// finish blocking
...
...
@@ -183,7 +189,7 @@ public class ThreadStateTest {
case
WAITING:
{
synchronized
(
globalLock
)
{
// signal main thread.
thrsync
.
signal
();
phaser
.
arrive
();
System
.
out
.
println
(
" myThread is going to wait."
);
try
{
globalLock
.
wait
();
...
...
@@ -196,7 +202,7 @@ public class ThreadStateTest {
case
TIMED_WAITING:
{
synchronized
(
globalLock
)
{
// signal main thread.
thrsync
.
signal
();
phaser
.
arrive
();
System
.
out
.
println
(
" myThread is going to timed wait."
);
try
{
globalLock
.
wait
(
10000
);
...
...
@@ -208,7 +214,7 @@ public class ThreadStateTest {
}
case
PARKED:
{
// signal main thread.
thrsync
.
signal
();
phaser
.
arrive
();
System
.
out
.
println
(
" myThread is going to park."
);
LockSupport
.
park
();
// give a chance for the main thread to block
...
...
@@ -217,7 +223,7 @@ public class ThreadStateTest {
}
case
TIMED_PARKED:
{
// signal main thread.
thrsync
.
signal
();
phaser
.
arrive
();
System
.
out
.
println
(
" myThread is going to timed park."
);
long
deadline
=
System
.
currentTimeMillis
()
+
10000
*
1000
;
LockSupport
.
parkUntil
(
deadline
);
...
...
@@ -228,20 +234,19 @@ public class ThreadStateTest {
}
case
SLEEPING:
{
// signal main thread.
thrsync
.
signal
();
phaser
.
arrive
();
System
.
out
.
println
(
" myThread is going to sleep."
);
try
{
Thread
.
sleep
(
1000000
);
}
catch
(
InterruptedException
e
)
{
// finish sleeping
interrupted
();
}
break
;
}
case
TERMINATE:
{
done
=
true
;
// signal main thread.
thrsync
.
signal
();
phaser
.
arrive
();
break
;
}
default
:
...
...
@@ -249,69 +254,66 @@ public class ThreadStateTest {
}
}
}
public
void
waitUntilStarted
()
{
// wait for MyThread.
thrsync
.
waitForSignal
();
goSleep
(
10
);
phaser
.
arriveAndAwaitAdvance
();
}
public
void
goBlocked
()
{
System
.
out
.
println
(
"Waiting myThread to go blocked."
);
setState
(
BLOCKED
);
// wait for MyThread to get blocked
thrsync
.
waitForSignal
();
goSleep
(
20
);
// wait for MyThread to get to a point just before being blocked
phaser
.
arriveAndAwaitAdvance
();
}
public
void
goWaiting
()
{
System
.
out
.
println
(
"Waiting myThread to go waiting."
);
setState
(
WAITING
);
// wait for MyThread to wait on object.
thrsync
.
waitForSignal
();
goSleep
(
20
);
// wait for MyThread to get to just before wait on object.
phaser
.
arriveAndAwaitAdvance
();
}
public
void
goTimedWaiting
()
{
System
.
out
.
println
(
"Waiting myThread to go timed waiting."
);
setState
(
TIMED_WAITING
);
// wait for MyThread timed wait call.
thrsync
.
waitForSignal
();
goSleep
(
20
);
// wait for MyThread to get to just before timed wait call.
phaser
.
arriveAndAwaitAdvance
();
}
public
void
goParked
()
{
System
.
out
.
println
(
"Waiting myThread to go parked."
);
setState
(
PARKED
);
// wait for MyThread state change to PARKED.
thrsync
.
waitForSignal
();
goSleep
(
20
);
// wait for MyThread to get to just before parked.
phaser
.
arriveAndAwaitAdvance
();
}
public
void
goTimedParked
()
{
System
.
out
.
println
(
"Waiting myThread to go timed parked."
);
setState
(
TIMED_PARKED
);
// wait for MyThread.
thrsync
.
waitForSignal
();
goSleep
(
20
);
// wait for MyThread to get to just before timed park.
phaser
.
arriveAndAwaitAdvance
();
}
public
void
goSleeping
()
{
System
.
out
.
println
(
"Waiting myThread to go sleeping."
);
setState
(
SLEEPING
);
// wait for MyThread.
thrsync
.
waitForSignal
();
goSleep
(
20
);
// wait for MyThread to get to just before sleeping
phaser
.
arriveAndAwaitAdvance
();
}
public
void
terminate
()
{
System
.
out
.
println
(
"Waiting myThread to terminate."
);
setState
(
TERMINATE
);
// wait for MyThread.
thrsync
.
waitForSignal
();
goSleep
(
20
);
// wait for MyThread to get to just before terminate
phaser
.
arriveAndAwaitAdvance
();
}
private
void
setState
(
int
newState
)
{
switch
(
state
)
{
case
BLOCKED:
while
(
state
==
BLOCKED
)
{
goSleep
(
2
0
);
goSleep
(
1
0
);
}
state
=
newState
;
break
;
...
...
@@ -337,50 +339,4 @@ public class ThreadStateTest {
}
}
}
static
class
ThreadExecutionSynchronizer
{
private
boolean
waiting
;
private
Semaphore
semaphore
;
public
ThreadExecutionSynchronizer
()
{
semaphore
=
new
Semaphore
(
1
);
waiting
=
false
;
}
// Synchronizes two threads execution points.
// Basically any thread could get scheduled to run and
// it is not possible to know which thread reaches expected
// execution point. So whichever thread reaches a execution
// point first wait for the second thread. When the second thread
// reaches the expected execution point will wake up
// the thread which is waiting here.
void
stopOrGo
()
{
semaphore
.
acquireUninterruptibly
();
// Thread can get blocked.
if
(!
waiting
)
{
waiting
=
true
;
// Wait for second thread to enter this method.
while
(!
semaphore
.
hasQueuedThreads
())
{
try
{
Thread
.
sleep
(
20
);
}
catch
(
InterruptedException
xx
)
{}
}
semaphore
.
release
();
}
else
{
waiting
=
false
;
semaphore
.
release
();
}
}
// Wrapper function just for code readability.
void
waitForSignal
()
{
stopOrGo
();
}
void
signal
()
{
stopOrGo
();
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录