This page presents a (ideally) ever-growing list of concurrent, open-source Java programs that I have found available on the Internet. The plan is to classify them according to attributes that are both of general interest (e.g., lines of source) and those that are specific to my own research interests. It is my belief that this list should be helpful for those attempting to do programming language reseach on concurrent, Java-like languages who are in need of suitable examples and benchmarks.
|Toy||This program is (in my opinion) a toy example.|
|Emb!||This program is embarassingly parallel, requiring no or little synchronization.|
|States||This program has some state-machine style behavior|
|Constructs||Synchronization constructs used. Includes Syn (synchronized), WNJ (wait/notify/join), J5C (Java5 Concurrency Libraries) and Cust (custom synchronization primitives).|
|Chat||Syn, WNJ||622||Original (Incomplete)||Cached (Incomplete)||This is a much more realistic appliction than the others. Unfortunately, it was written as an assignment for a lab and is therefore incomplete, however making it run is really easy if you follow the directions on the lab page. This is a GUI application that runs over the network. Different threads exist to listen to the network and open up connections. I have found two race conditions in this program.|
|Miasma.java||Syn, WNJ||365||Original||Cached||A simple applet that draws a plasma-like substance quickly. I'll try not to post too many applets here because their synchronization behavior is usually pretty similar, however this applet interestingly waits to generate new data until a draw has occurred, so it may be interesting for that reason.|
|Webserver.java||Syn||155||Aldrich et al.||Local||A simple program with "web server-like" concurent behavior. Writer thread writes numbers to a hash table while readers remove them. A true producer/consumer example, except that get from the hash table could in theory insert a new element, although this should not happen here. Rewritten to use generics. Because the paper describes the removal of unncessary synchronization, most methods are synchronized.|
|DiningPhilosophers.ajava||Cust||138||Description||Local||This implementation actually uses the 'atomic' construct, suitable for use in implementations of transactional memory like AtomJava. Since AtomJava does not have 'retry,' busy waiting is used. Otherwise, this is an implementation of the standard dining philosophers problem.|
|pizzaDemo2.java||Syn||369||Original||Cached Copy||Applet. Not a strict producer/consumer. Customer thread writes to pizza storage shared object. Also, modifier methods of shared object call notify, presumably for some applet functionality which I don't understand. Wait is never called by the user's code.|
PS. This page is pretty ugly! It's CSS gone awry...