SlideShare una empresa de Scribd logo
1 de 23
1
Instituto Tecnológico Superior
de Felipe Carrillo Puerto
Informe Técnico de la unidad 4
Ingeniería en sistemas computacionales
Tópicos Avanzados de programación
Unidad 4. Programación concurrente.
Realizado por
Ángel Felipe Suaste Tuz
Carla Balam Méndez
Bella Areli Perez Gomez
Miriam Candelaria Poot Pech
Irving Saul Che Canul
Luis Antonio Chan Chuc
2
Proyecto multihilos llamado AppHilos
Código de la FormaHilos
Código clase Jugador 1
Código clase Jugador 2
Código clase Jugador 3
Conclusiones
Conclusión Angel Felipe Suaste Tuz
Conclusión Carla Balam Méndez
Conclusión Bella Areli Perez Gomez
Conclusión Miriam Candelaria Poot Pech
Conclusión Irving Saul Che Canul
Conclusión Luis Antonio Chan Chuc
Conclusión general
Conclusión general
3
Proyecto multihilos llamado AppHilos
Código de la FormaHilos
package Fisica; //paquete de la clase
import Logica.clsJugador1; //importamos la clase del jugador 1
import Logica.clsJugador2; //importamos la clase del jugador 2
import Logica.clsJugador3; //importamos la clase del jugador 3
import javax.swing.JOptionPane; //importamos la clase JOptionaPane
import javax.swing.table.DefaultTableModel; //importamos la clase TableModel
public class FormaHilos extends javax.swing.JFrame { //inicia la clase FormaHilos, subclase de
JFrame
javax.swing.table.DefaultTableModel modeloTabla = new
javax.swing.table.DefaultTableModel(); //creamos un objeto de TableModel
javax.swing.table.DefaultTableModel modTablaP1= new
javax.swing.table.DefaultTableModel(); //creamos una tabla para el jugador 1, de tipo
TableModel
javax.swing.table.DefaultTableModel modTablaP2= new
javax.swing.table.DefaultTableModel(); //creamos una tabla para el jugador 2, de tipo
TableModel
javax.swing.table.DefaultTableModel modTablaP3= new
javax.swing.table.DefaultTableModel(); //creamos una tabla para el jugador 3, de tipo
TableModel
Object[]filas = new Object[24]; //creamos un arreglo de tipo Object, que tiene un tamaño de
24, que es la tabla que se ve al inicio del programa.
Object [] datosJugador1 = new Object[3]; //creamos un arreglo de tipo Object, que tiene un
tamaño de 3, para el jugador 1
Object [] datosJugador2 = new Object[3]; //creamos un arreglo de tipo Object, que tiene un
tamaño de 3, para el jugador 2
Object [] datosJugador3 = new Object[3]; //creamos un arreglo de tipo Object, que tiene un
tamaño de 3, para el jugador 3
public Boolean seguir = true; //varible tipo boolean
4
//variables tipo entero que iniciamos con ceros, para cada jugador
int celdaJugador1=0;
int celdaJugador2=0;
int celdaJugador3=0;
//variables tipo entero que iniciamos con ceros
int p=0;
int q=0;
int m=0;
//instanciamos tres objetos un objeto por cada clase, previamente importando
clsJugador1 jug1 = new clsJugador1();
clsJugador2 jug2 = new clsJugador2();
clsJugador3 jug3 = new clsJugador3();
public FormaHilos() { //inicio del constructor de la clase
//como vemos este constructor, va a servir que cuando se ejecute el proyecto cargue
//el metodo cargarTabla() y los tres labels.
initComponents();
cargarTabla();
jLabel1.setText("Jugador: " + jug1.getNombre().toUpperCase());
jLabel2.setText("Jugador: " + jug2.getNombre().toUpperCase());
jLabel3.setText("Jugador: " + jug3.getNombre().toUpperCase());
}//fin del constructor
void cargarDetalle(){ //inicio del método cargarDetalle
//el siguiente for agrega ceros a la tabla de 24 columnas.
for (int i = 0; i<24; i++){
filas [i]=0;
} //fin for1
//este otro for hace que de forma aleatoria la tabla de 24 columnas tenga un -1 segun el
numero aleatorio que caiga.
for (int x = 1; x<=3; x++){
int numero = (int ) (Math.random()*22+1);
filas[numero]=-1;
modeloTabla.addRow(filas);
tabla.setModel(modeloTabla);
5
}//fin for 2
} //fin del metodo cargarDetalle()
void cargarTabla(){ //inicio metodo cargarTabla()
for (int i = 1;i<=24;i++){
modeloTabla.addColumn(String.valueOf(i));
}
cargarDetalle(); //llamar metodo cargarDetalle()
}//fin del metodo cargarTabla()
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
tabla = new javax.swing.JTable();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jScrollPane4 = new javax.swing.JScrollPane();
tablePlayer1 = new javax.swing.JTable();
jScrollPane6 = new javax.swing.JScrollPane();
tablePlayer3 = new javax.swing.JTable();
jScrollPane7 = new javax.swing.JScrollPane();
tablePlayer2 = new javax.swing.JTable();
btnRestart = new javax.swing.JButton();
btnGenerar = new javax.swing.JButton();
lblp2 = new javax.swing.JLabel();
lblp3 = new javax.swing.JLabel();
lblp1 = new javax.swing.JLabel();
btnPlay = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
tabla.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null},
{null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null}
},
6
new String [] {
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18",
"19", "20", "21", "22", "23", "24"
}
));
jScrollPane1.setViewportView(tabla);
//poniendole texto a los labels
jLabel1.setText("Jugador 1");
jLabel2.setText("Jugador 2");
jLabel3.setText("Jugador 3");
tablePlayer1.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null}
},
new String [] {
//texto de las columnas de la tabla del jugador 1
"Celda Avance", "Contenido Celda", "Celda Actual"
}
));
jScrollPane4.setViewportView(tablePlayer1);
tablePlayer3.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null}
},
new String [] {
//texto de las columnas de la tabla del jugador 2
"Celda Avance", "Contenido Celda", "Celda Actual"
}
));
jScrollPane6.setViewportView(tablePlayer3);
tablePlayer2.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null}
},
new String [] {
//texto de las columnas de la tabla del jugador 3
"Celda Avance", "Contenido Celda", "Celda Actual"
}
7
));
jScrollPane7.setViewportView(tablePlayer2);
btnRestart.setText("Restart Game"); //texto del boton
btnRestart.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnRestartActionPerformed(evt);
}
});
btnGenerar.setText("Generar"); //texto del boton
btnGenerar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnGenerarActionPerformed(evt);
}
});
//texto de las etiquetas
lblp2.setText("Interracciones: 0");
lblp3.setText("Interracciones: 0");
lblp1.setText("Interracciones: 0");
btnPlay.setText("Play"); //texto del boton, despues de aqui todo el código es generado por
el editor
btnPlay.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnPlayActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(110, 110, 110)
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jLabel2)
.addGap(244, 244, 244)
.addComponent(jLabel3)
8
.addGap(138, 138, 138))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE,
344, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(lblp2)
.addComponent(jScrollPane7, javax.swing.GroupLayout.PREFERRED_SIZE,
344, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(btnPlay)
.addGap(62, 62, 62)
.addComponent(btnRestart)
.addGap(152, 152, 152)
.addComponent(btnGenerar))
.addComponent(lblp1))))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane6, javax.swing.GroupLayout.PREFERRED_SIZE, 344,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(lblp3))
.addContainerGap(245, Short.MAX_VALUE))
.addComponent(jScrollPane1)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 125,
Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1)
9
.addComponent(jLabel3))
.addComponent(jLabel2, javax.swing.GroupLayout.Alignment.TRAILING))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane7, javax.swing.GroupLayout.PREFERRED_SIZE, 323,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jScrollPane6, javax.swing.GroupLayout.PREFERRED_SIZE, 323,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, 323,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lblp1)
.addComponent(lblp2)
.addComponent(lblp3))
.addGap(29, 29, 29)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(btnRestart)
.addComponent(btnGenerar)
.addComponent(btnPlay))
.addContainerGap())
);
pack();
}// </editor-fold>
private void btnRestartActionPerformed(java.awt.event.ActionEvent evt) {
//este método deja en blanco las tablas de los jugadores al presionar el botón restart,
asimismo habilita el boton play y deshabilita este mismo botón después de que hace su
cometido
limpiarTabla(this.tablePlayer1);
limpiarTabla(this.tablePlayer2);
limpiarTabla(this.tablePlayer3);
btnPlay.setEnabled(true);
btnRestart.setEnabled(false);
lblp1.setText("Interacciones: 0");
lblp2.setText("Interacciones: 0");
lblp3.setText("Interacciones: 0");
10
}
private void btnPlayActionPerformed(java.awt.event.ActionEvent evt) {
//este es el metodo del boton play, como vemos se instancian tres objetos de las clases
jugador1, jugador2 y jugador3.
Seguidamente vemos como llamamos a los métodos start() para cada objeto.
clsJugador1 j1;
j1= new clsJugador1(this);
clsJugador2 j2;
j2= new Logica.clsJugador2(this);
clsJugador3 j3;
j3= new Logica.clsJugador3(this);
j1.start();
j2.start();
j3.start();
if (seguir ==false){
j1= null;
j2= null;
j3= null;
}
//aqui se deshabilita el boton de play despues de ejecutarse una vez
btnPlay.setEnabled(false);
//aqui se habilita el boton de Restar despues de ejecutarse el evento del boton Play
btnRestart.setEnabled(true);
}
private void btnGenerarActionPerformed(java.awt.event.ActionEvent evt) {
modeloTabla.removeRow(0);
tabla.setModel(modeloTabla);
cargarDetalle();
}
//con este metodo hacemos que las tablas se limpien
public void limpiarTabla(javax.swing.JTable miTabla) {
DefaultTableModel modelo = (DefaultTableModel)
miTabla.getModel();
while(modelo.getRowCount()>0)modelo.removeRow(0);
celdaJugador1=0;
celdaJugador2=0;
celdaJugador3=0;
11
seguir = true;
}
public void moverJugador1 (int celda) {
try{
//el siguiente if determina si el jugador 1, ha llegado a 24; en caso de ser verdadero,
hace que la celda del jugador1 sea igual a 24 y seguir se vuelve false, para que se deje de
ejecutar y ademas imprime que el jugador uno ha ganado
celdaJugador1+=celda;
if (celdaJugador1>=24&& seguir ==true){
celdaJugador1=24;
seguir = false;
JOptionPane.showMessageDialog(null, "Juego Terminado... Ganó el jugador No." +
String.valueOf(jug1.getNumero()) +
", " + jug1.getNombre().toUpperCase());
}
//este otro if es en caso de que el jugador 1 aún no ha llegado a 24, como vemos este if tiene
if’s anidados
if (celdaJugador1<=24){
Object valorCelda = tabla.getValueAt(0,celdaJugador1);
//este if determina si el valor es -1 de la celda, de ser asi toma el valor de 0
if ("-1".equals(valorCelda.toString()))
celdaJugador1=0;
if (p==0) { confTablaJugadores(this.modTablaP1); p=1; }
datosJugador1[0]=String.valueOf(celda);
datosJugador1[1]=valorCelda;
datosJugador1[2]=celdaJugador1;
modTablaP1.addRow(datosJugador1);
tablePlayer1.setModel(modTablaP1);
lblp1.setText("interacciones: " + String.valueOf(modTablaP1.getRowCount()));
}
}catch (Exception ex){
seguir = false;
}
12
}
public void moverJugador2 (int celda){
try {
celdaJugador2+=celda;
//el siguiente if determina si el jugador 2, ha llegado a 24; en caso de ser verdadero, hace que
la celda del jugador2 sea igual a 24 y seguir se vuelve false, para que se deje de ejecutar y
ademas imprime que el jugador dos ha ganado
if (celdaJugador2>=24 && seguir ==true){
celdaJugador2=24;
seguir =false;
JOptionPane.showMessageDialog(null, "Juego Terminado... Ganó el juagador No. " +
String.valueOf(jug2.getNumero()) +
", " + jug2.getNombre().toUpperCase());
} ←//aqui gana el player 2
//este otro if es en caso de que el jugador 1 aún no ha llegado a 24, como vemos este if
tiene if’s anidados→
if (celdaJugador2<=24){
Object valorCelda = tabla.getValueAt(0, celdaJugador2);
//este if determina si el valor es -1 de la celda, de ser asi toma el valor de 0
if ("-1".equals(valorCelda.toString())) celdaJugador2=0;
if (q==0){
confTablaJugadores(this.modTablaP2);
q=1;
}
datosJugador2[0]=String.valueOf(celda);
datosJugador2[1]=valorCelda;
datosJugador2[2]=celdaJugador2;
modTablaP2.addRow(datosJugador2);
tablePlayer2.setModel(modTablaP2);
lblp2.setText("interacciones:" + String.valueOf(modTablaP2.getRowCount()));
}
}catch (Exception ex){
seguir = false;
}
}
13
public void moverJugador3 ( int celda){
try{
celdaJugador3+=celda;
//el siguiente if determina si el jugador 2, ha llegado a 24; en caso de ser verdadero, hace que
la celda del jugador2 sea igual a 24 y seguir se vuelve false, para que se deje de ejecutar y
ademas imprime que el jugador dos ha ganado
if(celdaJugador3>=24&& seguir ==true){
celdaJugador3=24;
seguir =false;
JOptionPane.showMessageDialog(null, "Juego Terminado... Ganó el juagador No. "
+ String.valueOf(jug3.getNumero()) +
", " + jug3.getNombre().toUpperCase());
}//gana jugador 3
//este otro if es en caso de que el jugador 3 aún no ha llegado a 24, como vemos este if
tiene if’s anidados→
if (celdaJugador3<=24){
Object valorCelda=tabla.getValueAt(0, celdaJugador3);
if ("-1".equals(valorCelda.toString())) celdaJugador3=0;
if (m==0){
confTablaJugadores(this.modTablaP3);
m=1;
}
datosJugador3[0]=String.valueOf(celda);
datosJugador3[1]=valorCelda;
datosJugador3[2]=celdaJugador3;
modTablaP3.addRow(datosJugador3);
tablePlayer3.setModel(modTablaP3);
lblp3.setText("Interacciones: " + String.valueOf(modTablaP3.getRowCount()));
}
} catch (Exception ex){
seguir = false;
}
}
void confTablaJugadores(javax.swing.table.DefaultTableModel Modelo){
Modelo.addColumn("Celda Avance");
14
Modelo.addColumn("Contenido celda");
Modelo.addColumn("Celda actual");
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info :
javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(FormaHilos.class.getName()).log(java.util.logging.Level.SEV
ERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(FormaHilos.class.getName()).log(java.util.logging.Level.SEV
ERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(FormaHilos.class.getName()).log(java.util.logging.Level.SEV
ERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(FormaHilos.class.getName()).log(java.util.logging.Level.SEV
ERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new FormaHilos().setVisible(true);
15
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton btnGenerar;
private javax.swing.JButton btnPlay;
private javax.swing.JButton btnRestart;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane4;
private javax.swing.JScrollPane jScrollPane6;
private javax.swing.JScrollPane jScrollPane7;
private javax.swing.JLabel lblp1;
private javax.swing.JLabel lblp2;
private javax.swing.JLabel lblp3;
private javax.swing.JTable tabla;
private javax.swing.JTable tablePlayer1;
private javax.swing.JTable tablePlayer2;
private javax.swing.JTable tablePlayer3;
// End of variables declaration
}
16
Código clase Jugador 1
package Logica; //paquete de la clase
import javax.swing.JOptionPane; //se importa la clase JOptionPane
public class clsJugador1 extends Thread{ //inicia la clase que hereda de clase Thread
private int numero;
private String nombre; //sera el nombre del jugador
private boolean continuar=true; //variable tipo boolean
public clsJugador1(){ //constructor
//este constructor es el que lee el nombre del jugador 1
numero=1;
nombre= JOptionPane.showInputDialog("Digite el nombre del jugador1 ");
} //fin constructor
public int getNumero(){ //método que recibe y retorna número
return numero;
}
public String getNombre(){ //método que recibe y retorna el nombre introducido
return nombre;
}
public Fisica.FormaHilos formHilo; //creamos objeto tipo formHilos
public clsJugador1(Fisica.FormaHilos aThis){
formHilo = aThis;
}
public void detenerHilo (){ //método que detiene la ejecución de esta clase.
continuar=false;
}
public void run(){ //metodo run de Thread
while (continuar){ //aqui mientras continuar sea true se ejecuta:
try{ //esto es una excepción
int avance = (int)(Math.random()*4);
formHilo.moverJugador1(avance);
17
continuar = formHilo.seguir;
Thread.sleep(150);
}catch(InterruptedException ex){
}
}
}
}
Código clase Jugador 2
//el siguiente código es igual que la del jugador 1
package Logica;
import javax.swing.JOptionPane;
public class clsJugador2 extends Thread{
private int numero;
private String nombre;
private boolean continuar=true;
public clsJugador2(){
numero=2;
nombre= JOptionPane.showInputDialog("Digite el nombre del jugador2 ");
}
public int getNumero(){
return numero;
}
public String getNombre(){
return nombre;
}
public Fisica.FormaHilos formHilo;
public clsJugador2(Fisica.FormaHilos aThis){
formHilo = aThis;
18
}
public void detenerHilo (){
continuar=false;
}
//override
public void run(){
while (continuar){
try{
int avance = (int)(Math.random()*4);
formHilo.moverJugador2(avance);
continuar = formHilo.seguir;
Thread.sleep(150);
}catch(InterruptedException ex){
}
}
}
}
19
Código clase Jugador 3
//igual que la del jugador 1
package Logica;
import javax.swing.JOptionPane;
public class clsJugador3 extends Thread{
private int numero;
private String nombre;
private boolean continuar=true;
public clsJugador3(){
numero=3;
nombre= JOptionPane.showInputDialog("Digite el nombre del jugador 3");
}
public int getNumero(){
return numero;
}
public String getNombre(){
return nombre;
}
public Fisica.FormaHilos formHilo;
public clsJugador3(Fisica.FormaHilos aThis){
formHilo = aThis;
}
public void detenerHilo (){
continuar=false;
}
public void run(){
while (continuar){
try{
20
int avance = (int)(Math.random()*4);
formHilo.moverJugador3(avance);
continuar = formHilo.seguir;
Thread.sleep(150);
}catch(InterruptedException ex){
}
}
}
}
21
Conclusiones
Conclusión Angel Felipe Suaste Tuz
En el paquete Lógica se tienen tres clases, las cuales son las clases de los jugadores 1, 2 y 3,
en esas se lee nombres del jugador y su número.
En el otro paquete Física se tiene la clase que une a las otras 3 clases de jugadores, es en esta
clase llama FormaHilos que se programa el entorno de la aplicación y allí se codifica
prácticamente todo el juego.
Fue necesario utilizar varios métodos, para darle vida al proyecto entre los métodos utilizados
están los método start y sleep, propios de la clase Thread.
Conclusión Carla Balam Méndez
Este programa se trata de unos jugadores.el tema de esta unidad son los hilos.
utilizamos algunos métodos de hilos que son:
stop():Este método provoca que el hilo se detenga de manera inmediata.
suspend(): El método suspend() es distinto de stop(). suspend() toma el hilo y provoca que se
detenga su ejecución sin destruir el hilo de sistema subyacente, ni el estado del hilo
anteriormente en ejecución.
resume():El método resume() se utiliza para revivir un hilo suspendido.
como en otros programas manejamos e importamos paquetes, utilizamos constructores,
métodos y objetos. en la creación de las tablas manejamos componentes como botones,cajas
de texto, etc.
Conclusión Bella Areli Perez Gomez
Conclusión Miriam Candelaria Poot Pech
Conclusión Irving Saul Che Canul
Los distintos hilos de ejecución comparten una serie de recursos tales como el espacio
de memoria.
La pequeña aplicación permite interactuar a dos jugadores unas serias secuencias
que se ejecutan para permitir interactuar las clases y métodos creados.
La creación de métodos y la utilización de los mismo son quienes le dan vida al juego
para poder interactuar con usuarios definidos por nombre y números de intensidad,
stop():ejecuta la orden para que el hilo se detenga en la posición donde ese encuentre
22
suspend():toma el hilo y provoca que se detenga su ejecución sin destruir el hilo, esto
significa que no afecta los demás procesos solo la instancia en donde se encuentre
resume():este método es usado para reiniciar o reactivar los procesos ya detenidos
start(): es usado para iniciar los procesos
sleep():se usa para pausar o inhabilitar el proceso y el usuario determina en que
momento activarlo de nuevo
Conclusión Luis Antonio Chan Chuc
En este programa de tres jugadores, utilizamos lo que son los hilos, estos son definidos
ya sea por programador o por el usuario un hilo es cada uno de los flujos secuenciales
de control en el programa. Para ello fue necesario utilizar los métodos Resume
(reactiva un hilo suspendido), Stop (detiene el hilo inmediatamente), Suspend
(suspende el hilo), se retoma otra vez la interfaz gráfica. Al igual se implementó
métodos tales como string, sleep, en fin el uso de los métodos es muy necesario.
Conclusión general
23
En esta unidad aprendimos a manejar hilos. los hilos son definidos por el usuario o por el
programador, son procesos a los que el programador define un comportamiento e inicia en un
momento específico. para la creación de este programa como en los programas anteriores se
importaron paquetes, utilizamos constructores y métodos para operaciones. el programa se
trato de unos jugadores.
Para la programación de hilos, se tienen métodos que son propio de los hilos, ejemplos de
métodos principales de un hilo (thread)son:
stop(): este método provoca que el hilo se detenga de manera inmediata.
suspend(): el método suspend() es distinto de stop(). suspend() toma el hilo y provoca que se
detenga su ejecución sin destruir el hilo de sistema subyacente, ni el estado del hilo
anteriormente en ejecución.
resume() :el método resume() se utiliza para revivir un hilo suspendido.
setPriority( int ): el método setPriority() asigna al hilo la prioridad indicada por el valor pasado
como parámetro.
getPriority(): este método devuelve la prioridad del hilo de ejecución en curso, que es un valor
comprendido entre uno y diez.
setName( String ): este método permite identificar al hilo con un nombre nemónico. De esta
manera se facilita la depuración de programas multihilo.
getName(): este método devuelve el valor actual, de tipo cadena, asignado como nombre al
hilo en ejecución mediante setName().
Cuando un programa java comienza su ejecución, ya hay un hilo ejecutándose, a este hilo se le
denomina normalmente hilo principal del programa, porque es el único que se ejecuta al
comenzar el programa. Este hilo principal es importante por dos razones:
• Es el hilo a partir del cual se crean el resto de los hilos del programa.
• Normalmente, debe ser el último que finaliza su ejecución, ya que cuando el hilo principal
finaliza, el programa termina.
Aunque el hilo principal se crea automáticamente cuando el programa comienza, se puede
controlar a través de un objeto Thread. Para ello se debe de obtener una referencia al mismo
llamando al método currentThread( ), que es un miembro public static de Thread. Su forma
general es la siguiente :
currentThread( ) es miembro de Thread que permite obtener el hilo actual.
Thread t = Thread.currentThread( );

Más contenido relacionado

La actualidad más candente

Java AWT Tres en Raya
Java AWT Tres en RayaJava AWT Tres en Raya
Java AWT Tres en Rayajubacalo
 
00 introducción a Python
00 introducción a Python00 introducción a Python
00 introducción a PythonJuan Rodríguez
 
Manual de android
Manual de androidManual de android
Manual de androidJarboledah
 
Programación en OTcl
Programación en OTclProgramación en OTcl
Programación en OTclJesus Vilchez
 
Ejercicios de programacion concurrente
Ejercicios de programacion concurrenteEjercicios de programacion concurrente
Ejercicios de programacion concurrenteedgar muñoz
 
Tdd y clean code SG campus
Tdd y clean code SG campusTdd y clean code SG campus
Tdd y clean code SG campusSoftware Guru
 
Semana 2 Fundamentos de Python(Entradas, Salidas y Operaciones Aritméticas)
Semana 2   Fundamentos de Python(Entradas, Salidas y Operaciones Aritméticas)Semana 2   Fundamentos de Python(Entradas, Salidas y Operaciones Aritméticas)
Semana 2 Fundamentos de Python(Entradas, Salidas y Operaciones Aritméticas)Richard Eliseo Mendoza Gafaro
 
Proyecto tres en_raya_f_inal_mathias_y_grupo
Proyecto tres en_raya_f_inal_mathias_y_grupoProyecto tres en_raya_f_inal_mathias_y_grupo
Proyecto tres en_raya_f_inal_mathias_y_grupoRobertho Mathias
 
Ejercicios en Netbeans
Ejercicios en NetbeansEjercicios en Netbeans
Ejercicios en Netbeansedgar muñoz
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAVíctor Bolinches
 
Metodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a ObjetosMetodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a ObjetosWilliam Diaz S
 

La actualidad más candente (16)

Semana 5 Java Swing
Semana 5   Java SwingSemana 5   Java Swing
Semana 5 Java Swing
 
Semana 7 Proyecto Misión TIC 2022
Semana 7 Proyecto Misión TIC 2022Semana 7 Proyecto Misión TIC 2022
Semana 7 Proyecto Misión TIC 2022
 
Java AWT Tres en Raya
Java AWT Tres en RayaJava AWT Tres en Raya
Java AWT Tres en Raya
 
00 introducción a Python
00 introducción a Python00 introducción a Python
00 introducción a Python
 
Curso android studio
Curso android studioCurso android studio
Curso android studio
 
Manual de android
Manual de androidManual de android
Manual de android
 
Programación en OTcl
Programación en OTclProgramación en OTcl
Programación en OTcl
 
Ejercicios de programacion concurrente
Ejercicios de programacion concurrenteEjercicios de programacion concurrente
Ejercicios de programacion concurrente
 
Semana 3 Herencia en Java
Semana 3   Herencia en JavaSemana 3   Herencia en Java
Semana 3 Herencia en Java
 
Tdd y clean code SG campus
Tdd y clean code SG campusTdd y clean code SG campus
Tdd y clean code SG campus
 
Semana 2 Fundamentos de Python(Entradas, Salidas y Operaciones Aritméticas)
Semana 2   Fundamentos de Python(Entradas, Salidas y Operaciones Aritméticas)Semana 2   Fundamentos de Python(Entradas, Salidas y Operaciones Aritméticas)
Semana 2 Fundamentos de Python(Entradas, Salidas y Operaciones Aritméticas)
 
Proyecto tres en_raya_f_inal_mathias_y_grupo
Proyecto tres en_raya_f_inal_mathias_y_grupoProyecto tres en_raya_f_inal_mathias_y_grupo
Proyecto tres en_raya_f_inal_mathias_y_grupo
 
Ejercicios en Netbeans
Ejercicios en NetbeansEjercicios en Netbeans
Ejercicios en Netbeans
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
 
Metodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a ObjetosMetodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a Objetos
 
Doc tutorial-c++
Doc tutorial-c++Doc tutorial-c++
Doc tutorial-c++
 

Destacado

Destacado (20)

Cb eval josé luis caraguay
Cb eval josé luis caraguayCb eval josé luis caraguay
Cb eval josé luis caraguay
 
Practica3
Practica3Practica3
Practica3
 
Cb eval josé luis caraguay
Cb eval josé luis caraguayCb eval josé luis caraguay
Cb eval josé luis caraguay
 
Comenzar
ComenzarComenzar
Comenzar
 
Electrónica analogica
Electrónica analogicaElectrónica analogica
Electrónica analogica
 
Examen
Examen Examen
Examen
 
Practica martes22
Practica martes22Practica martes22
Practica martes22
 
Informe tecnico unidad 5 tap
Informe tecnico unidad 5 tapInforme tecnico unidad 5 tap
Informe tecnico unidad 5 tap
 
Emprendimiento
EmprendimientoEmprendimiento
Emprendimiento
 
Cb eval josé luis caraguay
Cb eval josé luis caraguayCb eval josé luis caraguay
Cb eval josé luis caraguay
 
Lgr 081 2
Lgr 081 2Lgr 081 2
Lgr 081 2
 
Esfera
EsferaEsfera
Esfera
 
Informe tecnico unidad 3
Informe tecnico unidad 3Informe tecnico unidad 3
Informe tecnico unidad 3
 
Examen Word
Examen WordExamen Word
Examen Word
 
Practica3
Practica3Practica3
Practica3
 
Fotos tomadas con ingenio
Fotos tomadas con ingenioFotos tomadas con ingenio
Fotos tomadas con ingenio
 
Mining Software Repositories
Mining Software RepositoriesMining Software Repositories
Mining Software Repositories
 
Informe tecnico unidad 2
Informe tecnico unidad 2Informe tecnico unidad 2
Informe tecnico unidad 2
 
Hn grupo4 depositos y filtros
Hn grupo4 depositos y filtrosHn grupo4 depositos y filtros
Hn grupo4 depositos y filtros
 
Tipos de eventos
Tipos de eventosTipos de eventos
Tipos de eventos
 

Similar a Informe tecnico unidad 4 (20)

Informe#23
Informe#23Informe#23
Informe#23
 
In 21
In 21In 21
In 21
 
24
2424
24
 
Programas e informes Programación
Programas e informes ProgramaciónProgramas e informes Programación
Programas e informes Programación
 
Informe karen jacome
Informe karen jacomeInforme karen jacome
Informe karen jacome
 
Informe tecnico eventos
Informe tecnico   eventosInforme tecnico   eventos
Informe tecnico eventos
 
Ejemplos robert miguel
Ejemplos robert miguelEjemplos robert miguel
Ejemplos robert miguel
 
Unidad 4: Polimorfismo Ejercicio 3
Unidad 4: Polimorfismo Ejercicio 3Unidad 4: Polimorfismo Ejercicio 3
Unidad 4: Polimorfismo Ejercicio 3
 
Apache Storm: Desarrollo
Apache Storm: DesarrolloApache Storm: Desarrollo
Apache Storm: Desarrollo
 
Tarea sesion 08_gottlieb
Tarea sesion 08_gottliebTarea sesion 08_gottlieb
Tarea sesion 08_gottlieb
 
Proyecto de compiladores Sentencia While con Java CUP y JFLEX
Proyecto de compiladores Sentencia While con Java CUP y JFLEXProyecto de compiladores Sentencia While con Java CUP y JFLEX
Proyecto de compiladores Sentencia While con Java CUP y JFLEX
 
AGENDA
AGENDAAGENDA
AGENDA
 
Informetecnicou2 topicos
Informetecnicou2 topicosInformetecnicou2 topicos
Informetecnicou2 topicos
 
Formatos tutoria laboratorio
Formatos tutoria laboratorioFormatos tutoria laboratorio
Formatos tutoria laboratorio
 
Informe#18
Informe#18Informe#18
Informe#18
 
Informe#15
Informe#15Informe#15
Informe#15
 
Informe#14
Informe#14Informe#14
Informe#14
 
Und 2 tema 2
Und 2  tema 2Und 2  tema 2
Und 2 tema 2
 
Practica 11
Practica 11Practica 11
Practica 11
 
Practica 10
Practica 10Practica 10
Practica 10
 

Último

Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxJOSEMANUELHERNANDEZH11
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024GiovanniJavierHidalg
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxpabonheidy28
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 

Último (16)

Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptx
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docx
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 

Informe tecnico unidad 4

  • 1. 1 Instituto Tecnológico Superior de Felipe Carrillo Puerto Informe Técnico de la unidad 4 Ingeniería en sistemas computacionales Tópicos Avanzados de programación Unidad 4. Programación concurrente. Realizado por Ángel Felipe Suaste Tuz Carla Balam Méndez Bella Areli Perez Gomez Miriam Candelaria Poot Pech Irving Saul Che Canul Luis Antonio Chan Chuc
  • 2. 2 Proyecto multihilos llamado AppHilos Código de la FormaHilos Código clase Jugador 1 Código clase Jugador 2 Código clase Jugador 3 Conclusiones Conclusión Angel Felipe Suaste Tuz Conclusión Carla Balam Méndez Conclusión Bella Areli Perez Gomez Conclusión Miriam Candelaria Poot Pech Conclusión Irving Saul Che Canul Conclusión Luis Antonio Chan Chuc Conclusión general Conclusión general
  • 3. 3 Proyecto multihilos llamado AppHilos Código de la FormaHilos package Fisica; //paquete de la clase import Logica.clsJugador1; //importamos la clase del jugador 1 import Logica.clsJugador2; //importamos la clase del jugador 2 import Logica.clsJugador3; //importamos la clase del jugador 3 import javax.swing.JOptionPane; //importamos la clase JOptionaPane import javax.swing.table.DefaultTableModel; //importamos la clase TableModel public class FormaHilos extends javax.swing.JFrame { //inicia la clase FormaHilos, subclase de JFrame javax.swing.table.DefaultTableModel modeloTabla = new javax.swing.table.DefaultTableModel(); //creamos un objeto de TableModel javax.swing.table.DefaultTableModel modTablaP1= new javax.swing.table.DefaultTableModel(); //creamos una tabla para el jugador 1, de tipo TableModel javax.swing.table.DefaultTableModel modTablaP2= new javax.swing.table.DefaultTableModel(); //creamos una tabla para el jugador 2, de tipo TableModel javax.swing.table.DefaultTableModel modTablaP3= new javax.swing.table.DefaultTableModel(); //creamos una tabla para el jugador 3, de tipo TableModel Object[]filas = new Object[24]; //creamos un arreglo de tipo Object, que tiene un tamaño de 24, que es la tabla que se ve al inicio del programa. Object [] datosJugador1 = new Object[3]; //creamos un arreglo de tipo Object, que tiene un tamaño de 3, para el jugador 1 Object [] datosJugador2 = new Object[3]; //creamos un arreglo de tipo Object, que tiene un tamaño de 3, para el jugador 2 Object [] datosJugador3 = new Object[3]; //creamos un arreglo de tipo Object, que tiene un tamaño de 3, para el jugador 3 public Boolean seguir = true; //varible tipo boolean
  • 4. 4 //variables tipo entero que iniciamos con ceros, para cada jugador int celdaJugador1=0; int celdaJugador2=0; int celdaJugador3=0; //variables tipo entero que iniciamos con ceros int p=0; int q=0; int m=0; //instanciamos tres objetos un objeto por cada clase, previamente importando clsJugador1 jug1 = new clsJugador1(); clsJugador2 jug2 = new clsJugador2(); clsJugador3 jug3 = new clsJugador3(); public FormaHilos() { //inicio del constructor de la clase //como vemos este constructor, va a servir que cuando se ejecute el proyecto cargue //el metodo cargarTabla() y los tres labels. initComponents(); cargarTabla(); jLabel1.setText("Jugador: " + jug1.getNombre().toUpperCase()); jLabel2.setText("Jugador: " + jug2.getNombre().toUpperCase()); jLabel3.setText("Jugador: " + jug3.getNombre().toUpperCase()); }//fin del constructor void cargarDetalle(){ //inicio del método cargarDetalle //el siguiente for agrega ceros a la tabla de 24 columnas. for (int i = 0; i<24; i++){ filas [i]=0; } //fin for1 //este otro for hace que de forma aleatoria la tabla de 24 columnas tenga un -1 segun el numero aleatorio que caiga. for (int x = 1; x<=3; x++){ int numero = (int ) (Math.random()*22+1); filas[numero]=-1; modeloTabla.addRow(filas); tabla.setModel(modeloTabla);
  • 5. 5 }//fin for 2 } //fin del metodo cargarDetalle() void cargarTabla(){ //inicio metodo cargarTabla() for (int i = 1;i<=24;i++){ modeloTabla.addColumn(String.valueOf(i)); } cargarDetalle(); //llamar metodo cargarDetalle() }//fin del metodo cargarTabla() @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane(); tabla = new javax.swing.JTable(); jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); jScrollPane4 = new javax.swing.JScrollPane(); tablePlayer1 = new javax.swing.JTable(); jScrollPane6 = new javax.swing.JScrollPane(); tablePlayer3 = new javax.swing.JTable(); jScrollPane7 = new javax.swing.JScrollPane(); tablePlayer2 = new javax.swing.JTable(); btnRestart = new javax.swing.JButton(); btnGenerar = new javax.swing.JButton(); lblp2 = new javax.swing.JLabel(); lblp3 = new javax.swing.JLabel(); lblp1 = new javax.swing.JLabel(); btnPlay = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); tabla.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null} },
  • 6. 6 new String [] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24" } )); jScrollPane1.setViewportView(tabla); //poniendole texto a los labels jLabel1.setText("Jugador 1"); jLabel2.setText("Jugador 2"); jLabel3.setText("Jugador 3"); tablePlayer1.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { {null, null, null} }, new String [] { //texto de las columnas de la tabla del jugador 1 "Celda Avance", "Contenido Celda", "Celda Actual" } )); jScrollPane4.setViewportView(tablePlayer1); tablePlayer3.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { {null, null, null} }, new String [] { //texto de las columnas de la tabla del jugador 2 "Celda Avance", "Contenido Celda", "Celda Actual" } )); jScrollPane6.setViewportView(tablePlayer3); tablePlayer2.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { {null, null, null} }, new String [] { //texto de las columnas de la tabla del jugador 3 "Celda Avance", "Contenido Celda", "Celda Actual" }
  • 7. 7 )); jScrollPane7.setViewportView(tablePlayer2); btnRestart.setText("Restart Game"); //texto del boton btnRestart.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnRestartActionPerformed(evt); } }); btnGenerar.setText("Generar"); //texto del boton btnGenerar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnGenerarActionPerformed(evt); } }); //texto de las etiquetas lblp2.setText("Interracciones: 0"); lblp3.setText("Interracciones: 0"); lblp1.setText("Interracciones: 0"); btnPlay.setText("Play"); //texto del boton, despues de aqui todo el código es generado por el editor btnPlay.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnPlayActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(110, 110, 110) .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jLabel2) .addGap(244, 244, 244) .addComponent(jLabel3)
  • 8. 8 .addGap(138, 138, 138)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, 344, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblp2) .addComponent(jScrollPane7, javax.swing.GroupLayout.PREFERRED_SIZE, 344, javax.swing.GroupLayout.PREFERRED_SIZE))) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(btnPlay) .addGap(62, 62, 62) .addComponent(btnRestart) .addGap(152, 152, 152) .addComponent(btnGenerar)) .addComponent(lblp1)))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane6, javax.swing.GroupLayout.PREFERRED_SIZE, 344, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblp3)) .addContainerGap(245, Short.MAX_VALUE)) .addComponent(jScrollPane1) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 125, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1)
  • 9. 9 .addComponent(jLabel3)) .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.TRAILING)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane7, javax.swing.GroupLayout.PREFERRED_SIZE, 323, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jScrollPane6, javax.swing.GroupLayout.PREFERRED_SIZE, 323, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, 323, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblp1) .addComponent(lblp2) .addComponent(lblp3)) .addGap(29, 29, 29) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnRestart) .addComponent(btnGenerar) .addComponent(btnPlay)) .addContainerGap()) ); pack(); }// </editor-fold> private void btnRestartActionPerformed(java.awt.event.ActionEvent evt) { //este método deja en blanco las tablas de los jugadores al presionar el botón restart, asimismo habilita el boton play y deshabilita este mismo botón después de que hace su cometido limpiarTabla(this.tablePlayer1); limpiarTabla(this.tablePlayer2); limpiarTabla(this.tablePlayer3); btnPlay.setEnabled(true); btnRestart.setEnabled(false); lblp1.setText("Interacciones: 0"); lblp2.setText("Interacciones: 0"); lblp3.setText("Interacciones: 0");
  • 10. 10 } private void btnPlayActionPerformed(java.awt.event.ActionEvent evt) { //este es el metodo del boton play, como vemos se instancian tres objetos de las clases jugador1, jugador2 y jugador3. Seguidamente vemos como llamamos a los métodos start() para cada objeto. clsJugador1 j1; j1= new clsJugador1(this); clsJugador2 j2; j2= new Logica.clsJugador2(this); clsJugador3 j3; j3= new Logica.clsJugador3(this); j1.start(); j2.start(); j3.start(); if (seguir ==false){ j1= null; j2= null; j3= null; } //aqui se deshabilita el boton de play despues de ejecutarse una vez btnPlay.setEnabled(false); //aqui se habilita el boton de Restar despues de ejecutarse el evento del boton Play btnRestart.setEnabled(true); } private void btnGenerarActionPerformed(java.awt.event.ActionEvent evt) { modeloTabla.removeRow(0); tabla.setModel(modeloTabla); cargarDetalle(); } //con este metodo hacemos que las tablas se limpien public void limpiarTabla(javax.swing.JTable miTabla) { DefaultTableModel modelo = (DefaultTableModel) miTabla.getModel(); while(modelo.getRowCount()>0)modelo.removeRow(0); celdaJugador1=0; celdaJugador2=0; celdaJugador3=0;
  • 11. 11 seguir = true; } public void moverJugador1 (int celda) { try{ //el siguiente if determina si el jugador 1, ha llegado a 24; en caso de ser verdadero, hace que la celda del jugador1 sea igual a 24 y seguir se vuelve false, para que se deje de ejecutar y ademas imprime que el jugador uno ha ganado celdaJugador1+=celda; if (celdaJugador1>=24&& seguir ==true){ celdaJugador1=24; seguir = false; JOptionPane.showMessageDialog(null, "Juego Terminado... Ganó el jugador No." + String.valueOf(jug1.getNumero()) + ", " + jug1.getNombre().toUpperCase()); } //este otro if es en caso de que el jugador 1 aún no ha llegado a 24, como vemos este if tiene if’s anidados if (celdaJugador1<=24){ Object valorCelda = tabla.getValueAt(0,celdaJugador1); //este if determina si el valor es -1 de la celda, de ser asi toma el valor de 0 if ("-1".equals(valorCelda.toString())) celdaJugador1=0; if (p==0) { confTablaJugadores(this.modTablaP1); p=1; } datosJugador1[0]=String.valueOf(celda); datosJugador1[1]=valorCelda; datosJugador1[2]=celdaJugador1; modTablaP1.addRow(datosJugador1); tablePlayer1.setModel(modTablaP1); lblp1.setText("interacciones: " + String.valueOf(modTablaP1.getRowCount())); } }catch (Exception ex){ seguir = false; }
  • 12. 12 } public void moverJugador2 (int celda){ try { celdaJugador2+=celda; //el siguiente if determina si el jugador 2, ha llegado a 24; en caso de ser verdadero, hace que la celda del jugador2 sea igual a 24 y seguir se vuelve false, para que se deje de ejecutar y ademas imprime que el jugador dos ha ganado if (celdaJugador2>=24 && seguir ==true){ celdaJugador2=24; seguir =false; JOptionPane.showMessageDialog(null, "Juego Terminado... Ganó el juagador No. " + String.valueOf(jug2.getNumero()) + ", " + jug2.getNombre().toUpperCase()); } ←//aqui gana el player 2 //este otro if es en caso de que el jugador 1 aún no ha llegado a 24, como vemos este if tiene if’s anidados→ if (celdaJugador2<=24){ Object valorCelda = tabla.getValueAt(0, celdaJugador2); //este if determina si el valor es -1 de la celda, de ser asi toma el valor de 0 if ("-1".equals(valorCelda.toString())) celdaJugador2=0; if (q==0){ confTablaJugadores(this.modTablaP2); q=1; } datosJugador2[0]=String.valueOf(celda); datosJugador2[1]=valorCelda; datosJugador2[2]=celdaJugador2; modTablaP2.addRow(datosJugador2); tablePlayer2.setModel(modTablaP2); lblp2.setText("interacciones:" + String.valueOf(modTablaP2.getRowCount())); } }catch (Exception ex){ seguir = false; } }
  • 13. 13 public void moverJugador3 ( int celda){ try{ celdaJugador3+=celda; //el siguiente if determina si el jugador 2, ha llegado a 24; en caso de ser verdadero, hace que la celda del jugador2 sea igual a 24 y seguir se vuelve false, para que se deje de ejecutar y ademas imprime que el jugador dos ha ganado if(celdaJugador3>=24&& seguir ==true){ celdaJugador3=24; seguir =false; JOptionPane.showMessageDialog(null, "Juego Terminado... Ganó el juagador No. " + String.valueOf(jug3.getNumero()) + ", " + jug3.getNombre().toUpperCase()); }//gana jugador 3 //este otro if es en caso de que el jugador 3 aún no ha llegado a 24, como vemos este if tiene if’s anidados→ if (celdaJugador3<=24){ Object valorCelda=tabla.getValueAt(0, celdaJugador3); if ("-1".equals(valorCelda.toString())) celdaJugador3=0; if (m==0){ confTablaJugadores(this.modTablaP3); m=1; } datosJugador3[0]=String.valueOf(celda); datosJugador3[1]=valorCelda; datosJugador3[2]=celdaJugador3; modTablaP3.addRow(datosJugador3); tablePlayer3.setModel(modTablaP3); lblp3.setText("Interacciones: " + String.valueOf(modTablaP3.getRowCount())); } } catch (Exception ex){ seguir = false; } } void confTablaJugadores(javax.swing.table.DefaultTableModel Modelo){ Modelo.addColumn("Celda Avance");
  • 14. 14 Modelo.addColumn("Contenido celda"); Modelo.addColumn("Celda actual"); } /** * @param args the command line arguments */ public static void main(String args[]) { /* Set the Nimbus look and feel */ //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(FormaHilos.class.getName()).log(java.util.logging.Level.SEV ERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(FormaHilos.class.getName()).log(java.util.logging.Level.SEV ERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(FormaHilos.class.getName()).log(java.util.logging.Level.SEV ERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(FormaHilos.class.getName()).log(java.util.logging.Level.SEV ERE, null, ex); } //</editor-fold> /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new FormaHilos().setVisible(true);
  • 15. 15 } }); } // Variables declaration - do not modify private javax.swing.JButton btnGenerar; private javax.swing.JButton btnPlay; private javax.swing.JButton btnRestart; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane4; private javax.swing.JScrollPane jScrollPane6; private javax.swing.JScrollPane jScrollPane7; private javax.swing.JLabel lblp1; private javax.swing.JLabel lblp2; private javax.swing.JLabel lblp3; private javax.swing.JTable tabla; private javax.swing.JTable tablePlayer1; private javax.swing.JTable tablePlayer2; private javax.swing.JTable tablePlayer3; // End of variables declaration }
  • 16. 16 Código clase Jugador 1 package Logica; //paquete de la clase import javax.swing.JOptionPane; //se importa la clase JOptionPane public class clsJugador1 extends Thread{ //inicia la clase que hereda de clase Thread private int numero; private String nombre; //sera el nombre del jugador private boolean continuar=true; //variable tipo boolean public clsJugador1(){ //constructor //este constructor es el que lee el nombre del jugador 1 numero=1; nombre= JOptionPane.showInputDialog("Digite el nombre del jugador1 "); } //fin constructor public int getNumero(){ //método que recibe y retorna número return numero; } public String getNombre(){ //método que recibe y retorna el nombre introducido return nombre; } public Fisica.FormaHilos formHilo; //creamos objeto tipo formHilos public clsJugador1(Fisica.FormaHilos aThis){ formHilo = aThis; } public void detenerHilo (){ //método que detiene la ejecución de esta clase. continuar=false; } public void run(){ //metodo run de Thread while (continuar){ //aqui mientras continuar sea true se ejecuta: try{ //esto es una excepción int avance = (int)(Math.random()*4); formHilo.moverJugador1(avance);
  • 17. 17 continuar = formHilo.seguir; Thread.sleep(150); }catch(InterruptedException ex){ } } } } Código clase Jugador 2 //el siguiente código es igual que la del jugador 1 package Logica; import javax.swing.JOptionPane; public class clsJugador2 extends Thread{ private int numero; private String nombre; private boolean continuar=true; public clsJugador2(){ numero=2; nombre= JOptionPane.showInputDialog("Digite el nombre del jugador2 "); } public int getNumero(){ return numero; } public String getNombre(){ return nombre; } public Fisica.FormaHilos formHilo; public clsJugador2(Fisica.FormaHilos aThis){ formHilo = aThis;
  • 18. 18 } public void detenerHilo (){ continuar=false; } //override public void run(){ while (continuar){ try{ int avance = (int)(Math.random()*4); formHilo.moverJugador2(avance); continuar = formHilo.seguir; Thread.sleep(150); }catch(InterruptedException ex){ } } } }
  • 19. 19 Código clase Jugador 3 //igual que la del jugador 1 package Logica; import javax.swing.JOptionPane; public class clsJugador3 extends Thread{ private int numero; private String nombre; private boolean continuar=true; public clsJugador3(){ numero=3; nombre= JOptionPane.showInputDialog("Digite el nombre del jugador 3"); } public int getNumero(){ return numero; } public String getNombre(){ return nombre; } public Fisica.FormaHilos formHilo; public clsJugador3(Fisica.FormaHilos aThis){ formHilo = aThis; } public void detenerHilo (){ continuar=false; } public void run(){ while (continuar){ try{
  • 20. 20 int avance = (int)(Math.random()*4); formHilo.moverJugador3(avance); continuar = formHilo.seguir; Thread.sleep(150); }catch(InterruptedException ex){ } } } }
  • 21. 21 Conclusiones Conclusión Angel Felipe Suaste Tuz En el paquete Lógica se tienen tres clases, las cuales son las clases de los jugadores 1, 2 y 3, en esas se lee nombres del jugador y su número. En el otro paquete Física se tiene la clase que une a las otras 3 clases de jugadores, es en esta clase llama FormaHilos que se programa el entorno de la aplicación y allí se codifica prácticamente todo el juego. Fue necesario utilizar varios métodos, para darle vida al proyecto entre los métodos utilizados están los método start y sleep, propios de la clase Thread. Conclusión Carla Balam Méndez Este programa se trata de unos jugadores.el tema de esta unidad son los hilos. utilizamos algunos métodos de hilos que son: stop():Este método provoca que el hilo se detenga de manera inmediata. suspend(): El método suspend() es distinto de stop(). suspend() toma el hilo y provoca que se detenga su ejecución sin destruir el hilo de sistema subyacente, ni el estado del hilo anteriormente en ejecución. resume():El método resume() se utiliza para revivir un hilo suspendido. como en otros programas manejamos e importamos paquetes, utilizamos constructores, métodos y objetos. en la creación de las tablas manejamos componentes como botones,cajas de texto, etc. Conclusión Bella Areli Perez Gomez Conclusión Miriam Candelaria Poot Pech Conclusión Irving Saul Che Canul Los distintos hilos de ejecución comparten una serie de recursos tales como el espacio de memoria. La pequeña aplicación permite interactuar a dos jugadores unas serias secuencias que se ejecutan para permitir interactuar las clases y métodos creados. La creación de métodos y la utilización de los mismo son quienes le dan vida al juego para poder interactuar con usuarios definidos por nombre y números de intensidad, stop():ejecuta la orden para que el hilo se detenga en la posición donde ese encuentre
  • 22. 22 suspend():toma el hilo y provoca que se detenga su ejecución sin destruir el hilo, esto significa que no afecta los demás procesos solo la instancia en donde se encuentre resume():este método es usado para reiniciar o reactivar los procesos ya detenidos start(): es usado para iniciar los procesos sleep():se usa para pausar o inhabilitar el proceso y el usuario determina en que momento activarlo de nuevo Conclusión Luis Antonio Chan Chuc En este programa de tres jugadores, utilizamos lo que son los hilos, estos son definidos ya sea por programador o por el usuario un hilo es cada uno de los flujos secuenciales de control en el programa. Para ello fue necesario utilizar los métodos Resume (reactiva un hilo suspendido), Stop (detiene el hilo inmediatamente), Suspend (suspende el hilo), se retoma otra vez la interfaz gráfica. Al igual se implementó métodos tales como string, sleep, en fin el uso de los métodos es muy necesario. Conclusión general
  • 23. 23 En esta unidad aprendimos a manejar hilos. los hilos son definidos por el usuario o por el programador, son procesos a los que el programador define un comportamiento e inicia en un momento específico. para la creación de este programa como en los programas anteriores se importaron paquetes, utilizamos constructores y métodos para operaciones. el programa se trato de unos jugadores. Para la programación de hilos, se tienen métodos que son propio de los hilos, ejemplos de métodos principales de un hilo (thread)son: stop(): este método provoca que el hilo se detenga de manera inmediata. suspend(): el método suspend() es distinto de stop(). suspend() toma el hilo y provoca que se detenga su ejecución sin destruir el hilo de sistema subyacente, ni el estado del hilo anteriormente en ejecución. resume() :el método resume() se utiliza para revivir un hilo suspendido. setPriority( int ): el método setPriority() asigna al hilo la prioridad indicada por el valor pasado como parámetro. getPriority(): este método devuelve la prioridad del hilo de ejecución en curso, que es un valor comprendido entre uno y diez. setName( String ): este método permite identificar al hilo con un nombre nemónico. De esta manera se facilita la depuración de programas multihilo. getName(): este método devuelve el valor actual, de tipo cadena, asignado como nombre al hilo en ejecución mediante setName(). Cuando un programa java comienza su ejecución, ya hay un hilo ejecutándose, a este hilo se le denomina normalmente hilo principal del programa, porque es el único que se ejecuta al comenzar el programa. Este hilo principal es importante por dos razones: • Es el hilo a partir del cual se crean el resto de los hilos del programa. • Normalmente, debe ser el último que finaliza su ejecución, ya que cuando el hilo principal finaliza, el programa termina. Aunque el hilo principal se crea automáticamente cuando el programa comienza, se puede controlar a través de un objeto Thread. Para ello se debe de obtener una referencia al mismo llamando al método currentThread( ), que es un miembro public static de Thread. Su forma general es la siguiente : currentThread( ) es miembro de Thread que permite obtener el hilo actual. Thread t = Thread.currentThread( );