Hallo Florian,
Deine Motivation ist durchaus verständlich, deine Anforderungen an Modularität und Abstraktion sind für verteilte Applikationen auch durchaus gängig, nur solltest du deinen Lösungsansatz überdenken.
Dazu zu deinem konkreten Fall:
Ich wollte nicht direkte Referenzierung
implementieren wenn sich die andere Komponente auf dem
gleichen Rechner befindet und dann noch einmal eine
Stream-Variante wenn die Kommunikation über das Netzwerk
erfolgt.
Das Problem, das du hast ist, dass du zwar die Kommunikation abstrahierst, aber nicht die Daten die du austauscht. Wenn du deine Komponenten in Zukunft trennst (unterschiedlicher Prozessraum), dann kannst du das zwar, weil dein Kommunikationskanal das unterstützt, funktionieren wird es aber trotzdem nicht, weil die Referenz die du überträgst ungültig wird wenn du sie in einen anderen Prozessraum überträgst.
D. h. du musst Daten übertragen die es beiden Threads unabhängig voneinander erlauben auf diesselbe Ressource zugreifen können.
Was das ist hängt jetzt wieder davon ab was hinter deinen Streams steht, wenns eine Datei ist könntest du z. B. einen Dateinamen übertragen. Allerdings musst du dann noch die Probleme beim konkurrierenden Zugriff auf die Datei lösen (z. B. über ein Lock-File).
Ein ganz anderer Lösungsansatz wäre es eine RPC-Variante zu implementieren, z. B. über Java RMI (Remote Method Invocation). Damit können Prozesse auf Objekte zugreifen die in einem anderen Prozessraum laufen. Da hättest du dann ein zentrales Objekt das den Zugriff auf die Ressource übernimmt und alle anderen Prozesse greifen über das Netzwerk auf dieses zentrale Objekt zu.
Was sich für dich eignet hängt von dem Anwendungsfall ab. Die RMI-Variante hängt halt an einer zentralen Stelle, wenn die ausfällt, dann gehen die anderen Prozesse auch nicht mehr (das würde sich über verteilte EJBs lösen lass, je nachdem was du tust ist das aber wahrscheinlich Overkill).
Falls du noch Fragen zu dem Thema hast, frag einfach. 
Grüße, Robert