testmultiple.java
来自「This is a resource based on j2me embedde」· Java 代码 · 共 237 行
JAVA
237 行
/* * * * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program 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 program 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 at /legal/license.txt). * * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */package com.sun.midp.links;import com.sun.cldc.isolate.Isolate;import com.sun.midp.i3test.TestCase;import java.io.IOException;import java.io.InterruptedIOException;import java.util.Enumeration;import java.util.Hashtable;import java.util.Random;/** * Tests multiple receiving or sending threads blocked on the same link. */public class TestMultiple extends TestCase { /** * The number of senders or receivers. */ public static final int NUM_THREADS = 10; /** * Amount of time to wait for threads to complete after sending or * receiving a message. */ public static final long TIMEOUT = 100L; Random rand = new Random(); Object lock = new Object(); Hashtable doneset; // Set<Thread> Hashtable messages; // Map<Thread, LinkMessage> Hashtable throwables; // Map<Thread, Throwable> /** * Common code for completion callbacks for LoggingReceiver and * LoggingSender. Adds the thread to the done set; if non-null, adds msg * to the map of received messages; if non-null, adds any throwables * caught to the map of caught throwables. */ public void completed(Thread thr, LinkMessage msg, Throwable exc) { synchronized (lock) { assertFalse("shouldn't be done already", doneset.containsKey(thr)); doneset.put(thr, thr); if (msg != null) { messages.put(thr, msg); } if (exc != null) { throwables.put(thr, exc); } } } /** * Adds a completion callback to a Receiver thread. */ class LoggingReceiver extends Receiver { public LoggingReceiver(Link newlink) { super(newlink); } public void completed(LinkMessage msg, Throwable exc) { TestMultiple.this.completed(this, msg, exc); } } /** * Adds a completion callback to a Sender thread. */ class LoggingSender extends Sender { public LoggingSender(Link newlink, LinkMessage lm) { super(newlink, lm); } public void completed(LinkMessage msg, Throwable exc) { TestMultiple.this.completed(this, msg, exc); } } /** * Tests multiple receivers blocked on the same link. Creates NUM_THREADS * threads to receive messages. Then, sends messages one by one, and * ensures that each time exactly one thread is unblocked and has received * the message just sent. Finally, after sending enough messages, ensures * that all threads have been accounted for. */ void testReceivers() throws IOException { Isolate is = Isolate.currentIsolate(); Link link = Link.newLink(is, is); Receiver ra[] = new LoggingReceiver[NUM_THREADS]; doneset = new Hashtable(NUM_THREADS); messages = new Hashtable(NUM_THREADS); throwables = new Hashtable(NUM_THREADS); for (int i = 0; i < NUM_THREADS; i++) { ra[i] = new LoggingReceiver(link); } Utils.sleep(2*TIMEOUT); for (int i = 0; i < NUM_THREADS; i++) { String s = Integer.toString(rand.nextInt()); messages.clear(); throwables.clear(); link.send(LinkMessage.newStringMessage(s)); Utils.sleep(TIMEOUT); assertEquals("iteration " + i, i + 1, doneset.size()); assertEquals("one message", 1, messages.size()); for (Enumeration e = messages.elements() ; e.hasMoreElements() ; ) { LinkMessage msg = (LinkMessage)e.nextElement(); assertTrue("message should contain a string", msg.containsString()); String rs = msg.extractString(); assertEquals("strings should be equal", s, rs); } assertEquals("zero throwables", 0, throwables.size()); for (Enumeration e = throwables.elements() ; e.hasMoreElements() ; ) { System.out.println("### " + e.nextElement()); } } for (int i = 0; i < NUM_THREADS; i++) { assertTrue("should be done", doneset.containsKey(ra[i])); doneset.remove(ra[i]); } } /** * Tests multiple senders blocked on the same link. Creates NUM_THREADS * threads to send messages. Then, receives messages one by one, and * ensures that each time exactly one thread is unblocked and had sent the * message just received. Finally, after receiving enough messages, * ensures that all threads have been accounted for. */ void testSenders() throws IOException { Isolate is = Isolate.currentIsolate(); Link link = Link.newLink(is, is); LoggingSender sa[] = new LoggingSender[NUM_THREADS]; for (int i = 0; i < NUM_THREADS; i++) { String s = Integer.toString(rand.nextInt()); sa[i] = new LoggingSender(link, LinkMessage.newStringMessage(s)); } Utils.sleep(2*TIMEOUT); doneset = new Hashtable(NUM_THREADS); throwables = new Hashtable(NUM_THREADS); for (int i = 0; i < NUM_THREADS; i++) { LinkMessage rm; String rs; messages.clear(); throwables.clear(); rm = link.receive(); Utils.sleep(TIMEOUT); assertEquals("iteration " + i, i + 1, doneset.size()); assertTrue("message should contain a string", rm.containsString()); rs = rm.extractString(); assertEquals("one message", 1, messages.size()); for (Enumeration e = messages.elements() ; e.hasMoreElements() ; ) { LinkMessage msg = (LinkMessage)e.nextElement(); String ss = msg.extractString(); assertEquals("strings should be equal", ss, rs); } assertEquals("zero throwables", 0, throwables.size()); for (Enumeration e = throwables.elements() ; e.hasMoreElements() ; ) { System.out.println("### " + e.nextElement()); } } for (int i = 0; i < NUM_THREADS; i++) { assertTrue("should be done", doneset.containsKey(sa[i])); doneset.remove(sa[i]); } } /** * Runs all tests. */ public void runTests() throws IOException { declare("testReceivers"); testReceivers(); declare("testSenders"); testSenders(); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?