Pregunta

Cuando uso hilos, a veces los visualizo como uniendo entre sí 3 o más interconexiones dimensionales entre objetos en un contexto espacial. Este no es un caso de uso general, pero para lo que hago es una forma útil de pensarlo.

¿Hay alguna API que use que ayude a enhebrar?

¿Ha utilizado hilos de una manera que no conceptualice como un hilo que es un proceso?

¿Fue útil?

Solución

¿Hay alguna API que use que ayude a enhebrar?

¿Te refieres a parte de java.util.concurrent ? FunctionalJava obtuvo algunas construcciones que ayudan en la programación concurrente, como se describe en un tutorial de varias partes que comienza aquí .

¿Ha utilizado hilos de una manera que no se conceptualice como un hilo que es un proceso?

Sí, en la medida en que los hilos no conceptualizan en absoluto. Tome un corredor de tareas asíncrono, por ejemplo. Utiliza hilos debajo de las cubiertas, pero no los veo y no me importan. Están completamente gestionados por el corredor de tareas.

Debajo de las cubiertas, son solo hilos, pero cuando dejamos de preocuparnos por el hilo individual y solo pensamos en ellos como una serie de ranuras donde de alguna manera puedes poner código y ejecutarlo por un período de tiempo, entonces es entonces cuando comenzamos a alcanzar un mayor nivel de abstracción.

Agentes / Actores es una forma común de hacer esto. Un actor es como un hilo que tiene un bulto de estado, y luego puede enviarle un código y decir "haga esto a su estado cuando tenga tiempo". o algo por el estilo.

Otros consejos

Primero que nada

El descargo de responsabilidad habitual: la programación concurrente, en cualquier idioma, utilizando cualquier nivel de abstracción, es difícil y complicado y tiene muchos riesgos. Tener en cuenta:

  • La programación concurrente complica cualquier aplicación por magnitud
  • Las secciones críticas de pruebas unitarias son difíciles y, a veces, imposibles
  • La reproducción de errores que se originan en código concurrente es muy difícil y depende mucho de la arquitectura, el sabor del sistema operativo, la versión, etc. ...

API simultáneas de Java

Java ha recorrido un largo camino para hacer que la programación concurrente sea lo más fácil posible para los desarrolladores. Para la mayoría de los casos, verá que java.util.concurrent tiene la mayoría de las abstracciones que necesitará:

    Interfaz
  • Ejecutable y objeto Thread que puede extender. Simplemente ingrese su código y tendrá un hilo listo para ejecutarse
  • Un buen conjunto de Executors : grupo constante, grupo dinámico, programado o lo que sea. Simplemente arroje un Runnable y se encargará del resto.
  • Semaphore s y bloqueos de todo tipo lo liberan de la necesidad de implementar técnicas de bloqueo comunes.
  • Una API incorporada wait () y notify () para todos los objetos.

Usos

Lo único que le queda, como ingeniero de software, es asegurarse de que está escribiendo el código correcto . Lo que significa que debe ser consciente de las situaciones peligrosas a las que podría estar exponiéndose:

  • Punto muerto : una situación en la que dos o más subprocesos esperan recursos no ordenados, lo que genera un ciclo de espera infinito.
  • Livelock : dos o más hilos que intentan cortésmente dar paso al otro en un recurso compartido pero terminan sin tomarlo (considere a dos personas en un corredor que se acercan y se mueven constantemente juntos de lado a lado)
  • Hambruna : un solo hilo que ocupa la mayor parte o la totalidad de un recurso compartido único, lo que priva a otros hilos del acceso a él.

Punto principal (o cuándo usar)

Use hilos solo cuando la concurrencia mejorará directamente el comportamiento de sus aplicaciones.

Si está esperando un recurso de IO / red / hardware, DO genera un hilo para que pueda continuar haciendo otras cosas.

Si solo está tratando de dividir con elegancia los cálculos vinculados a la CPU, NO use hilos. Podría terminar empeorando su rendimiento.

Si utiliza hilos, asegúrese de haber contemplado a fondo los riesgos y verifique tres veces que no se haya perdido ninguna situación excepcional.

Recursos útiles (en línea)

La manera más rápida de entrar en las cosas es hacer el Tutorial de concurrencia de Sun . Aparte de eso, consigue un buen libro.

Buena suerte :)

La concurrencia es un tema profundo y complicado para cubrir. Libros como Java Concurrency in Practice pueden ayudar.

Consulte Descripción general de las utilidades de concurrencia para API en subprocesos. BlockingQueue < E > puede ser útil, por ejemplo.

  

Una cola que además admite   operaciones que esperan la cola para   dejar de estar vacío al recuperar un   elemento, y espere a que el espacio se convierta   disponible en la cola cuando se almacena un   elemento.

Ver CountDownLatch

  

Una ayuda de sincronización que permite   o más hilos para esperar hasta un conjunto de   operaciones que se realizan en otro   hilos completados.

y CyclicBarrier por algún comportamiento interesante.

  

Una ayuda de sincronización que permite un   conjunto de hilos para que todos esperen cada uno   otro para alcanzar un punto de barrera común.

Editar : Estoy leyendo Java Concurrency in Practice ahora. Está muy bien.

  

Cuando uso hilos, a veces los visualizo entrelazando 3 o más interconexiones dimensionales entre objetos en un contexto espacial.

Eso suena complicado, ¿cómo conceptualizarías 600 hilos, por ejemplo? ¿Por qué no pensar en ellos como múltiples hilos de ejecución que se ejecutan aparentemente al mismo tiempo?

  

¿Hay alguna API que use que ayude a enhebrar?

Sugiero que las más simples y directas son las primeras coincidencias que encontrarás. http://www.google.co.uk/search?q=java+ hilos

  

¿Has utilizado hilos de una manera que no conceptualice como un hilo que es un proceso?

Dado que los hilos no son procesos, no puedo decir que alguna vez haya pensado en los hilos como procesos. (Excepto en versiones anteriores de Linux) Los procesos no comparten memoria / objetos de forma predeterminada para comenzar, se ejecutan de forma completamente independiente (generalmente programas diferentes, posiblemente escritos en diferentes idiomas) También se inician de manera diferente usando diferentes API.

Existe la opinión de que los subprocesos múltiples son complicados. En realidad diría lo contrario. La programación multiproceso requiere que haga que su código sea simple, fácil de entender y directo a razonar. Si bien esto requiere experiencia, su objetivo es la simplicidad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top