Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
661b8ba3
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看板
提交
661b8ba3
编写于
6月 11, 2013
作者:
A
alanb
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
7059085: Retire Thread.stop(Throwable) so that it throws UOE
Reviewed-by: dholmes, chegar, forax, darcy, mduigou
上级
3a31a3f1
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
90 addition
and
60 deletion
+90
-60
src/share/classes/java/lang/Thread.java
src/share/classes/java/lang/Thread.java
+21
-60
test/java/lang/Thread/StopThrowable.java
test/java/lang/Thread/StopThrowable.java
+69
-0
未找到文件。
src/share/classes/java/lang/Thread.java
浏览文件 @
661b8ba3
...
@@ -812,68 +812,10 @@ class Thread implements Runnable {
...
@@ -812,68 +812,10 @@ class Thread implements Runnable {
*/
*/
@Deprecated
@Deprecated
public
final
void
stop
()
{
public
final
void
stop
()
{
stop
(
new
ThreadDeath
());
}
/**
* Forces the thread to stop executing.
* <p>
* If there is a security manager installed, the <code>checkAccess</code>
* method of this thread is called, which may result in a
* <code>SecurityException</code> being raised (in the current thread).
* <p>
* If this thread is different from the current thread (that is, the current
* thread is trying to stop a thread other than itself) or
* <code>obj</code> is not an instance of <code>ThreadDeath</code>, the
* security manager's <code>checkPermission</code> method (with the
* <code>RuntimePermission("stopThread")</code> argument) is called in
* addition.
* Again, this may result in throwing a
* <code>SecurityException</code> (in the current thread).
* <p>
* If the argument <code>obj</code> is null, a
* <code>NullPointerException</code> is thrown (in the current thread).
* <p>
* The thread represented by this thread is forced to stop
* whatever it is doing abnormally and to throw the
* <code>Throwable</code> object <code>obj</code> as an exception. This
* is an unusual action to take; normally, the <code>stop</code> method
* that takes no arguments should be used.
* <p>
* It is permitted to stop a thread that has not yet been started.
* If the thread is eventually started, it immediately terminates.
*
* @param obj the Throwable object to be thrown.
* @exception SecurityException if the current thread cannot modify
* this thread.
* @throws NullPointerException if obj is <tt>null</tt>.
* @see #interrupt()
* @see #checkAccess()
* @see #run()
* @see #start()
* @see #stop()
* @see SecurityManager#checkAccess(Thread)
* @see SecurityManager#checkPermission
* @deprecated This method is inherently unsafe. See {@link #stop()}
* for details. An additional danger of this
* method is that it may be used to generate exceptions that the
* target thread is unprepared to handle (including checked
* exceptions that the thread could not possibly throw, were it
* not for this method).
* For more information, see
* <a href="{@docRoot}/../technotes/guides/concurrency/threadPrimitiveDeprecation.html">Why
* are Thread.stop, Thread.suspend and Thread.resume Deprecated?</a>.
*/
@Deprecated
public
final
synchronized
void
stop
(
Throwable
obj
)
{
if
(
obj
==
null
)
throw
new
NullPointerException
();
SecurityManager
security
=
System
.
getSecurityManager
();
SecurityManager
security
=
System
.
getSecurityManager
();
if
(
security
!=
null
)
{
if
(
security
!=
null
)
{
checkAccess
();
checkAccess
();
if
((
this
!=
Thread
.
currentThread
())
||
if
(
this
!=
Thread
.
currentThread
())
{
(!(
obj
instanceof
ThreadDeath
)))
{
security
.
checkPermission
(
SecurityConstants
.
STOP_THREAD_PERMISSION
);
security
.
checkPermission
(
SecurityConstants
.
STOP_THREAD_PERMISSION
);
}
}
}
}
...
@@ -884,7 +826,26 @@ class Thread implements Runnable {
...
@@ -884,7 +826,26 @@ class Thread implements Runnable {
}
}
// The VM can handle all thread states
// The VM can handle all thread states
stop0
(
obj
);
stop0
(
new
ThreadDeath
());
}
/**
* Throws {@code UnsupportedOperationException}.
*
* @param obj ignored
*
* @deprecated This method was originally designed to force a thread to stop
* and throw a given {@code Throwable} as an exception. It was
* inherently unsafe (see {@link #stop()} for details), and furthermore
* could be used to generate exceptions that the target thread was
* not prepared to handle.
* For more information, see
* <a href="{@docRoot}/../technotes/guides/concurrency/threadPrimitiveDeprecation.html">Why
* are Thread.stop, Thread.suspend and Thread.resume Deprecated?</a>.
*/
@Deprecated
public
final
synchronized
void
stop
(
Throwable
obj
)
{
throw
new
UnsupportedOperationException
();
}
}
/**
/**
...
...
test/java/lang/Thread/StopThrowable.java
0 → 100644
浏览文件 @
661b8ba3
/*
* Copyright (c) 2013, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 7059085
* @summary Check that Thread.stop(Throwable) throws UOE
* @run testng StopThrowable
*/
import
org.testng.annotations.Test
;
import
java.util.concurrent.CountDownLatch
;
public
class
StopThrowable
{
@Test
(
expectedExceptions
=
UnsupportedOperationException
.
class
)
public
void
testStopSelf
()
{
Thread
.
currentThread
().
stop
(
new
ThreadDeath
());
}
private
static
void
awaitUnchecked
(
CountDownLatch
latch
)
{
try
{
latch
.
await
();
}
catch
(
InterruptedException
e
)
{
// should not happen
throw
new
RuntimeException
(
e
);
}
}
@Test
(
expectedExceptions
=
UnsupportedOperationException
.
class
)
public
void
testStopOther
()
throws
Throwable
{
CountDownLatch
ready
=
new
CountDownLatch
(
1
);
CountDownLatch
done
=
new
CountDownLatch
(
1
);
Thread
t
=
new
Thread
(
()
->
{
ready
.
countDown
();
awaitUnchecked
(
done
);
}
);
t
.
start
();
try
{
ready
.
await
();
t
.
stop
(
new
ThreadDeath
());
}
finally
{
done
.
countDown
();
}
}
@Test
(
expectedExceptions
=
UnsupportedOperationException
.
class
)
public
void
testNull
()
{
Thread
.
currentThread
().
stop
(
null
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录