JavaScript Multithreading-Beispiel mit Nashorn
Threading ist jetzt in JavaScript möglich. Erfahren Sie, wie Sie mit Nashorn einen Thread in einer JavaScript-Stage instanziieren.
Ich schreibe seit mehr als 20 Jahren JavaScript für Unternehmensanwendungen. Anhand dieser Aussage können Sie unschwer erkennen, dass ich schon sehr, sehr lange ein Verfechter von JavaScript bin. JavaScript ist eine wirklich einzigartige Sprache, die Qualitäten sowohl von prozeduralen als auch von funktionalen Sprachen aufweist. Trotzdem fehlte immer ein Feature: das Konzept des Multithreading. Im Laufe der Jahre habe ich eine Reihe von Workarounds entwickelt, um Threading zu emulieren, aber erst als Java vom Rhino zum Nashorn Compiler wechselte, wurde eine echte Multi-Threading-Verarbeitung in JavaScript möglich.
Zu diesem Zweck habe ich ein paar Beispiele für die Instanziierung eines Threads in einer JavaScript-Stage bereitgestellt. Vielleicht möchten Sie dies für Dinge wie Streaming-Abfragen, Hintergrundprotokollierung oder -verarbeitung usw. verwenden.
Der Code:
function (doc) { logger.info("BEGIN THREAD TEST ****** "); try { // EXAMPLE 1 - Thread in Extended Runnable var Runnable = Java.type('java.lang.Runnable'); var Printer = Java.extend(Runnable, { run: function () { logger.info('printed from a separate thread'); } }); var Thread = Java.type('java.lang.Thread'); new Thread(new Printer()).start(); // EXAMPLE 2 - Thread Only new Thread(function () { logger.info('printed from another thread'); }).start(); } catch (err) { logger.error(err); } return doc; }
Aufschlüsseln
Was geht hier also vor? Der obige Code startet eigentlich zwei separate Threads: einen im Kontext eines erweiterten Runnable und einen eigenständigen Thread. Die Schnipsel sind relativ kurz, daher glaube ich nicht, dass wir die Schnipsel aufteilen müssen. Lange Rede, kurzer Sinn: Sie deklarieren eine Multithreading-fähige Klasse (alles, was Runnable implementiert), übergeben ihr eine Funktion als Argument und starten sie.
Mir ist klar, dass ich hier meinen inneren Geek zum Vorschein bringe, aber ich finde das wirklich wahnsinnig cool. Sie können jetzt funktionale Logik im Rahmen eines prozeduralen Objekts ausführen. Viel cooler geht es wirklich nicht mehr!
Dennoch gibt es einige wichtige Vorbehalte, die Sie beachten sollten:
- Wenn Sie einen eigenen Thread starten, sind Sie für dessen Beendigung verantwortlich. Stellen Sie sicher, dass Sie diese Verantwortung in Ihrem Code berücksichtigen.
- Die Anzahl der in der JVM zulässigen Threads ist endlich. Sie sollten Ihre Threads explizit starten (und stoppen) und sparsam mit ihnen umgehen. Denken Sie daran, dass ein benutzerdefinierter Prozess, der eine große Anzahl von Threads auslöst, möglicherweise mit anderen Prozessen in der Pipeline in Konflikt geraten könnte.
- Verwenden Sie keinen Thread in Ihrer Pipeline, es sei denn, es ist absolut notwendig.
Um es zusammenzufassen: Threading ist jetzt in JavaScript möglich, und es ist verdammt cool, aber nutzen Sie es mit Bedacht.