[ 
https://issues.apache.org/jira/browse/SANDBOX-231?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12616530#action_12616530
 ] 

Martin Kalén commented on SANDBOX-231:
--------------------------------------

Thank you for your feedback.

The synchronization target used for the currentTimeMillis field indeed looks 
like a bug in the original code. Changing this to ThreadClockImpl.class in the 
getUUIDTime does however not change the fact that Thread.start() can no longer 
be performed on a thread where the run() method has already completed (same 
IllegalStateExceptions, see the technote and recent JavaDoc for more 
information).

I agree with Sebb that the workerSuspended needs to be made volatile and will 
attach a new patch without this flaw.

However, I do not (yet?) see why the pattern from the technote using 
wait+notify as a substitution for suspend+resume (or like the original code: 
complete/end+re-start) is wrong. wait() and notify() both work on the Object's 
monitor and are, as far as I understand, intended for cross-thread 
communication on instances rather than explicit threads.

The way I read the technote Thread.interrupt() is recommended as a substitute 
for Thread.stop on a thread that waits for long periods ("e.g., for input"). I 
also read the original code as more of suspend/resume than explicit stop/start. 
The start() call seemed to me as just a substitute for re-run/resume, therefore 
I tried to follow the recommended patter for suspend/resume.

All feedback and/or corrections are welcome.

> Failing Tests
> -------------
>
>                 Key: SANDBOX-231
>                 URL: https://issues.apache.org/jira/browse/SANDBOX-231
>             Project: Commons Sandbox
>          Issue Type: Bug
>          Components: Id
>            Reporter: Donal Murtagh
>            Priority: Critical
>         Attachments: ThreadClockImpl_jdk6.patch
>
>
> I downloaded the HEAD of SVN, ran the tests and I get three failures 
> (appended to end of message). Is there a more stable version that I can 
> download/build?
> org.apache.commons.id.uuid.state.NodeTest
> testNodebyteArray(org.apache.commons.id.uuid.state.NodeTest)
> java.lang.IllegalThreadStateException
>       at java.lang.Thread.start(Thread.java:571)
>       at 
> org.apache.commons.id.uuid.clock.ThreadClockImpl.getUUIDTime(ThreadClockImpl.java:174)
>       at org.apache.commons.id.uuid.state.Node.getUUIDTime(Node.java:116)
>       at 
> org.apache.commons.id.uuid.state.NodeTest.testNodebyteArray(NodeTest.java:63)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>       at java.lang.reflect.Method.invoke(Method.java:585)
>       at junit.framework.TestCase.runTest(TestCase.java:154)
>       at junit.framework.TestCase.runBare(TestCase.java:127)
>       at junit.framework.TestResult$1.protect(TestResult.java:106)
>       at junit.framework.TestResult.runProtected(TestResult.java:124)
>       at junit.framework.TestResult.run(TestResult.java:109)
>       at junit.framework.TestCase.run(TestCase.java:118)
>       at junit.framework.TestSuite.runTest(TestSuite.java:208)
>       at junit.framework.TestSuite.run(TestSuite.java:203)
>       at 
> org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
>       at 
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
> testGetUUIDTime(org.apache.commons.id.uuid.state.NodeTest)
> java.lang.IllegalThreadStateException
>       at java.lang.Thread.start(Thread.java:571)
>       at 
> org.apache.commons.id.uuid.clock.ThreadClockImpl.getUUIDTime(ThreadClockImpl.java:174)
>       at org.apache.commons.id.uuid.state.Node.getUUIDTime(Node.java:116)
>       at 
> org.apache.commons.id.uuid.state.NodeTest.testGetUUIDTime(NodeTest.java:104)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>       at java.lang.reflect.Method.invoke(Method.java:585)
>       at junit.framework.TestCase.runTest(TestCase.java:154)
>       at junit.framework.TestCase.runBare(TestCase.java:127)
>       at junit.framework.TestResult$1.protect(TestResult.java:106)
>       at junit.framework.TestResult.runProtected(TestResult.java:124)
>       at junit.framework.TestResult.run(TestResult.java:109)
>       at junit.framework.TestCase.run(TestCase.java:118)
>       at junit.framework.TestSuite.runTest(TestSuite.java:208)
>       at junit.framework.TestSuite.run(TestSuite.java:203)
>       at 
> org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
>       at 
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
> testGetLastTimestamp(org.apache.commons.id.uuid.state.NodeTest)
> java.lang.IllegalThreadStateException
>       at java.lang.Thread.start(Thread.java:571)
>       at 
> org.apache.commons.id.uuid.clock.ThreadClockImpl.getUUIDTime(ThreadClockImpl.java:174)
>       at org.apache.commons.id.uuid.state.Node.getUUIDTime(Node.java:116)
>       at 
> org.apache.commons.id.uuid.state.NodeTest.testGetLastTimestamp(NodeTest.java:129)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>       at java.lang.reflect.Method.invoke(Method.java:585)
>       at junit.framework.TestCase.runTest(TestCase.java:154)
>       at junit.framework.TestCase.runBare(TestCase.java:127)
>       at junit.framework.TestResult$1.protect(TestResult.java:106)
>       at junit.framework.TestResult.runProtected(TestResult.java:124)
>       at junit.framework.TestResult.run(TestResult.java:109)
>       at junit.framework.TestCase.run(TestCase.java:118)
>       at junit.framework.TestSuite.runTest(TestSuite.java:208)
>       at junit.framework.TestSuite.run(TestSuite.java:203)
>       at 
> org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
>       at 
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
>       at 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to