A likely prerequisite for parallel programming in a distributed environment is a good message passing API. Java comes with various ready-made packages for communication, notably an easy-to-use interface to BSD sockets, and the Remote Method Invocation (RMI) mechanism. Interesting as these interfaces are, it is questionable whether parallel programmers will find them especially convenient. Sockets and remote procedure calls have been around for approximately as long as parallel computing has been fashionable, and neither of them has been popular in that field. Both of these communication models are optimized for client-server programming, whereas the parallel computing world is mainly concerned with a more symmetric model, where communications occur in groups of interacting peers.
This peer-to-peer model of communication is captured in the successful Message Passing Interface (MPI) standard, established in 1994 . MPI directly supports the Single Program Multiple Data (SPMD) model of parallel computing, wherein a group of processes cooperate by executing identical program images on local data values. Reliable point-to-point communication is provided through a shared, group-wide communicator, instead of socket pairs. MPI allows numerous blocking, non-blocking, buffered or synchronous communication modes. It also provides a library of true collective operations (broadcast is the most trivial example). An extended standard, MPI-2 , allows for dynamic process creation and access to memory in remote processes.
The MPI standard documents provided a language-independent specification as well as language-specific (C and Fortran) bindings . While the MPI-2 release of the standard added a C++ binding , no Java binding has been offered or is planned by the MPI Forum. With the evident success of Java as a programming language, and its inevitable use in connection with parallel as well as distributed computing, the absence of a well-designed language-specific binding for message-passing with Java will lead to divergent, non-portable practices. Indeed MPI-like binding for Java were developed independently by several teams. These will be briefly reviewed in the next section.
Over the last three years supporters of the Java Grande Forum  have been working actively to address some of the issues involved in using Java for technical computation. The goal of the forum has been to develop consensus and recommendations on possible enhancements to the Java language and associated Java standards, for large-scale (``Grande'') applications. Through a series of ACM-supported workshops and conferences the forum has helped stimulate research on Java compilers and programming environments. The Message-Passing Working Group of the Java Grande Forum was formed just over a year ago as a response to the appearance of the various APIs for message-passing. An immediate goal was to discuss a common API for MPI-like Java libraries. An initial draft for a common API specification was distributed at Supercomputing '98 . Since then the working group met in San Francisco and Syracuse, and a Birds of a Feather meeting was held at Supercomputing '99. Minutes of meetings are available at [9,10]. To avoid confusion with standards published by the original MPI Forum the nascent API is called MPJ (Message Passing interface for Java).