Methode nach schliessen der Konsole ausführen

Funktioniert leider nicht.
Ich hab alles gemacht wie beschrieben.(auch mithilfe von einem Buch muss also stimmen)

Noch andere Ideen?

edit:
Hat sich erledigt. :)
Mit strg+c funktionierts, das reicht fürs erste.
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

ein normaler ShutdownHook reicht dafür (wie zuvor bereits erwähnt wurde) nicht aus...
Um diese Funktionalität zu realisieren müsste man entweder mit einem Launcher Wrapper arbeiten oder neben dem Anwendungsprozess einen "Watchdog"-Prozess zur Überwachung des Anwendungsprozesses starten.

Letzteres sei hier mal kurz illustriert:

Java:
package de.tutorials.training;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import javax.swing.JOptionPane;

public class WatchedAppExample {

	public final static int trackerPort = 9999;

	public static void main(String[] args) throws Exception {
		new WatchedAppExample().run();
	}

	private void run() throws Exception {
		startTrackerServer();

		TimeUnit.SECONDS.sleep(1);

		startTrackerClient();

		appLogic();

	}

	private void appLogic() throws InterruptedException {
		while (true) {
			System.out.println("working ...");
			TimeUnit.SECONDS.sleep(1);
		}
	}

	private void startTrackerServer() {
		Executors.newSingleThreadExecutor().execute(newTrackerServer());
	}

	private Runnable newTrackerServer() {
		return new Runnable() {
			@Override
			public void run() {
				try {
					ServerSocket ss = new ServerSocket(trackerPort);
					Socket s = ss.accept();
					OutputStream out = s.getOutputStream();
					while (true) {
						out.write(1);
						out.flush();
						TimeUnit.SECONDS.sleep(1);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		};
	}

	private void startTrackerClient() throws Exception {
		new ProcessBuilder("cmd", "/c", "start", "javaw", "-cp", new File(
				getClass().getProtectionDomain().getCodeSource().getLocation()
						.toURI()).getAbsolutePath(),
				TrackerClient.class.getName()).start();

	}

	public static class TrackerClient {
		public static void main(String[] args) throws Exception {
			Socket socket = new Socket("localhost", trackerPort);
			InputStream in = socket.getInputStream();
			try {
				while (true) {
					int b = -1;
					while ((b = in.read()) != -1) {
					}
				}
			} catch (IOException e) {
				// e.printStackTrace(); app killed
			}
			JOptionPane.showMessageDialog(null, "The app was killed!");
		}
	}

}

Gruß Tom
 
Du kannst das cmd-Zeug auch weglassen und javaw direkt als ersten Parameter verwenden, das sollte dann auch wieder plattformübergreifend gehen.

Ist aber eine geniale Idee das so zu machen, könnte man ja vielleicht mal gebrauchen, daher gleich gesaved ^^
 
Zuletzt bearbeitet:
Hallo,

...ist jetzt leider nicht mehr das, was Java sein soll. Und zwar Cross-Plattform. Ich bekomme nur folgendes...
Ja das ist ja nur ein kleines exemplarisches Beispiel. Den Prozess-fork plattformunabhängig zu machen ist auch kein großes Problem, für das Beispiel wollte ich nicht gleich die ganz große Keule schwingen ;-)

Btw. neben der Möglichkeit dies mit einem Socket zu machen kann man natürlich auch File-Locks verwenden.

Gruß Tom
 
Zurück