Estoy volver a trabajar un ejecutable de Java que pueda ser arrancado varias veces, y quiero que el proceso de proceder a uno por vez. En C#, haría esto con un sistema/named Mutex, pero esto no parece ser posible en Java. ¿Cómo puedo lograr esta funcionalidad?Conseguir bloqueo exclusivo de todo el sistema en Java
Respuesta
Usted puede utilizar el acceso exclusivo a un archivo en el sistema de archivos para lograr un comportamiento similar. No creo que haya algo similar a lo que has mencionado.
Ejemplos
Cada vez que se inicia ejecutable de Java, se inicia una nueva instancia de la máquina virtual Java (JVM). Son como estaciones de trabajo diferentes. Es por eso que no existe tal cosa como mutex del sistema en Java.
Entiendo que se encuentran en diferentes tiempos de ejecución/procesos, pero muchos (¿la mayoría?) de los sistemas operativos proporcionan una función mutex del sistema. ¿Java no tiene una forma de acceder a él? –
El problema es que Mutex es una herramienta de sincronización. Si escribe una aplicación nativa, los mutex se pueden usar para sincronizar hilos (o procesos) en límites de una sola máquina. Pero si escribes una aplicación Java, entonces tu silencio es java.lang.Object. Tiene métodos de espera/notificación, pero tienen sentido solo en los límites de una sola máquina (JVM). Un ejemplo: alojamiento en la nube de Java en Google App Engine. Crea nuevas JVM a pedido. El programador no sabe si se crea una nueva JVM en el mismo host o en otro nodo del clúster. – Antonio
Esa es la misma historia para, por ejemplo, Las aplicaciones .NET, sin embargo, tienen mutexes con nombre. La historia corta es que Java no. – nos
Si su sistema operativo proporciona estas exclusiones mutuas, tal vez usted podría hacer con una biblioteca nativa? (http://en.wikipedia.org/wiki/Java_Native_Interface) Por supuesto, accederá a este recurso de una manera específica del sistema operativo, por lo que perderá la portabilidad que Java puro le brinda.
Java es una herramienta mínimo común denominador que proporciona funcionalidad que es común a todas las plataformas que se ejecuta en, es decir, si se ha implementado todavía.
You could use JNA (Una manera simplificada acceder a la funcionalidad nativa)
En el pasado he utilizado tomas para asegurarse de que un programa no puede iniciarse si se estaba ejecutando.
Como se indica en otro lugar, un semáforo basado en archivos podría funcionar, por supuesto una desventaja de esto es si el programa se bloquea entonces su semáforo debe ser restablecido manualmente.
Recuerde que Java se ejecuta en una máquina virtual Java. Al igual que los mecanismos de sincronización del nivel del sistema operativo generalmente solo afectan a la máquina en la que se ejecuta, los mecanismos nativos de sincronización de Java solo funcionan dentro de esa JVM.
Intentar evitar que se inicien varias JVM para hacer algo es análogo a tratar de evitar que una aplicación se ejecute al mismo tiempo en varias máquinas físicas, y probablemente no valga la pena.
Eso solo es correcto con respecto a las aplicaciones del lado del servidor. Muchas aplicaciones de GUI del lado del cliente requieren solo una versión para ejecutarse a la vez y no hay ninguna alternativa. – Dennis
Él no preguntaría si no valdría la pena ... Quizás no pueda evitar el arranque de varios JVM, pero ¿a quién le importa? Lo importante es colocar este bloqueo en el punto más temprano del programa para que pueda esperar/abortar si se están ejecutando otros procesos. – jontejj
- 1. NHibernate: bloqueo exclusivo
- 2. Actualización de boost :: shared_lock al bloqueo exclusivo
- 3. MySQL InnoDB bloqueo muerto en SELECT con bloqueo exclusivo (FOR UPDATE)
- 4. ¿Cómo bloqueo exclusivo de la base de datos mysql?
- 5. incorrecta nombre del sistema operativo conseguir en Java
- 6. Descubre qué proceso tiene un bloqueo exclusivo en el asa de un dispositivo USB
- 7. Abrir una conexión Sqlite con un bloqueo exclusivo en Java/Scala usando la biblioteca SQlite JDBC
- 8. ¿Cómo establecer umask en todo el sistema?
- 9. Bloqueo con nombre compartido y exclusivo para python
- 10. conseguir todo el espacio total y disponible en Android
- 11. O exclusivo en el Esquema
- 12. ¿Cuál es la diferencia entre un bloqueo exclusivo y un bloqueo compartido?
- 13. Conseguir el Java Swing 'n Drag' Cursor
- 14. ¿Es posible omitir un bloqueo de archivo en C# cuando otro subproceso/proceso utiliza un bloqueo exclusivo?
- 15. Bloqueo parcial en java
- 16. bloqueo gama en java
- 17. Mutex en todo el sistema en Python en Linux
- 18. bloqueo de subproceso Java
- 19. Pausa confiablemente Reproducción multimedia en todo el sistema en Android
- 20. efectos de bloqueo en Java
- 21. O exclusivo en Oracle
- 22. Bloqueo de archivos Java
- 23. Problemas para comprender todo el sistema ecológico web OSGi
- 24. Liberar bloqueo de archivos Java en Windows
- 25. Android - Activación del sistema de bloqueo de teclas (también conocido como bloqueo de pantalla)
- 26. expresión regular para conseguir todo después de la última barra
- 27. bloqueo en el interior de bloqueo
- 28. Exclusivo O en expresión regular
- 29. Java doble bloqueo bloqueado
- 30. Rastreo de una llamada al sistema de bloqueo C
¿cómo conseguirías acceso exclusivo a un archivo? –
polluelo esto: http://forums.sun.com/thread.jspa?threadID=465792 –
http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/FileLock .html –