Don't we want to be able to tell if a thread is Blocked anyway?
geir
Tim Ellison wrote:
> I hadn't appreciated that the read call is blocking...
>
> So how about you do the blocking read() in a new thread, then the main
> thread can poll to wait until the reading thread's state is Blocked,
> before closing the channel and forcing the exception?
>
> The problem is that the thread will be detached from the VM and blocking
> in the OS for the read, so not officially Java Blocked. You can only
> determine OS blocked state via additional native code.
>
> Therefore, as Paulex wrote, if you are not writing additional native
> code for your test you may have to actually synchronize on the reading
> thread having passed begin(), not when it is actually read() blocked.
>
> Does that make sense?
>
> Regards,
> Tim
>
> Andrew Zhang wrote:
>> Hello Tim,
>>
>> Thank you for your suggestion. :)
>>
>> Of course, "fix" is the best choice. I also have tried to use
>> "wait/notify",
>> but found it didn't work for this case.
>>
>> Please note that "channel1.read(targetBuf); // Label 3" is a blocking
>> operation. And we want code at label 1,2 to execute after label 3.
>>
>> There is the question:
>>
>> Where should I put "notify"?
>>
>> 1. before "read"? NO. If nofity is put before read, then we still can't
>> guarantee "configureBlocking" is executed after read.
>> 2. after "read"? NO. read is a blocking operatoin. It will never be
>> executed
>> if put notify after read.
>> 3. in "read"? Obviously NO.
>>
>> Please correct me if I'm wrong.
>>
>> Thanks!
>>
>>
>> On 7/11/06, Tim Ellison <[EMAIL PROTECTED]> wrote:
>>> Andrew Zhang wrote:
>>>> Hello everybody,
>>>>
>>>> I noticed such tests in DatagramChannel, which is useful, but
>>> potentially
>>>> unstable. Consider:
>>>>
>>>> public void testReadWrite_configureBlock() throws Exception {
>>>> byte[] targetArray = new byte[2];
>>>> // bind and connect
>>>> this.channel1.socket().bind(localAddr2);
>>>> this.channel1.connect(localAddr1);
>>>> this.channel2.socket().bind(localAddr1);
>>>> this.channel2.connect(localAddr2);
>>>> ByteBuffer targetBuf = ByteBuffer.wrap(targetArray);
>>>>
>>>> new Thread() {
>>>> public void run() {
>>>> try {
>>>> Thread.sleep(TIME_UNIT);
>>>> channel1.configureBlocking(false); // Label 1
>>>> channel1.close(); // Label 2
>>>> } catch (Exception e) {
>>>> //ignore
>>>> }
>>>> }
>>>> }.start();
>>>> try {
>>>> this.channel1.read(targetBuf); // Label 3
>>>> fail("should throw AsynchronousCloseException");
>>>> } catch (AsynchronousCloseException e) {
>>>> // ok
>>>> }
>>>> }
>>>> This test assumes Label 3 code should execute before Label 1 and Label
>>> 2,
>>>> which is right in most cases, because the code invokes "Thread.sleep
>>>> (TIME_UNIT)".
>>>>
>>>> However, it's potentially unstable. It heavily depends on TIME_UNIT
>>> value,
>>>> test environment (Hardware, OS ...)
>>> Urgh. There are *very* few occasions when you need to use
>>> Thread.sleep(); and 'thread synchronization' is definitely not one of
>>> them!
>>>
>>> If you have order dependencies between two or more threads then use
>>> wait/notify, or synchronized, and make them explicit.
>>>
>>> There are any number of books on multi-threaded programming in Java.
>>>
>>>> Indubitably, the test is very useful for testing
>>>> "AsynchronousCloseException" of DatagramChannel.read(ByteBuffer)
>>> method.
>>>> How shall we deal with such issue? Deleting such valuable tests is not
>>> a
>>>> wise decision, while keeping them may cause build system fail.
>>>>
>>>> One solution I could image is TestNG. :) i.e. Use "@dev" or
>>> something to
>>>> mark such tests, say, the tests are only for developing purpose.
>>>>
>>>> Any suggestions?
>>> Fix it! :-)
>>>
>>> Regards,
>>> Tim
>>>
>>> --
>>>
>>> Tim Ellison ([EMAIL PROTECTED])
>>> IBM Java technology centre, UK.
>>>
>>> ---------------------------------------------------------------------
>>> Terms of use : http://incubator.apache.org/harmony/mailing.html
>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>>> For additional commands, e-mail: [EMAIL PROTECTED]
>>>
>>>
>>
>
---------------------------------------------------------------------
Terms of use : http://incubator.apache.org/harmony/mailing.html
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]