1. Prioridad de hilos
Ejemplos de uso de prioridad de hilo:
paquete cn.galc.test; public class testThread6 {public static void main (string args []) {mythread4 t4 = new myThread4 (); MyThread5 t5 = new MyThread5 (); Hilo t1 = nuevo hilo (t4); Hilo t2 = nuevo hilo (t5); t1.setPriority (hild.norm_priority + 3); // use el método setpriority () para establecer la prioridad de los hilos, y aquí la prioridad de los hilos t1 se establece/** Aumenta la prioridad de los hilos t1 por nivel 3 sobre la base de la prioridad normal (norm_priority)* de esta manera, el tiempo de ejecución de T1 será mucho más que el de T2* por defecto, el valor de Norm_ Normidad es 5** t1.start (); t2.start (); System.out.println ("La prioridad del hilo T1 es:" + t1.getpriority ()); // Use el método getPriority () para obtener la prioridad del hilo e imprimir la prioridad de t1 para ser 8}} myThread4 implementa runnable {public void run () {para (int i = 0; i <= 1000; i ++) {System.out.println ("t1:"+i); }}} class myThread5 implementos runnables {public void run () {for (int i = 0; i <= 1000; i ++) {System.out.println ("==================== T2:"+i); }}} Tan pronto como termina el método ejecutado (), el hilo termina.2. Sincronización de hilos
Ejemplos de uso de palabras clave sincronizadas:
paquete cn.galc.test; public class testSync implements runnable {timer timer = new Timer (); public static void main (string args []) {testSync test = new testSync (); Hilo t1 = nuevo hilo (prueba); Hilo t2 = nuevo hilo (prueba); t1.setName ("T1"); // Establezca el nombre del hilo T1 T2.SetName ("T2"); // Establezca el nombre del hilo T2 T1.Start (); t2.start (); } public void run () {timer.add (Thread.CurrentThread (). getName ()); }} Temporizador de clases {private static int num = 0; public/ * sincronizado */void add (nombre de cadena) {// Al agregar sincronizado al declarar un método, significa que el objeto actual está bloqueado durante la ejecución de este método sincronizado (este) {/ * * use sincronizado (esto) para bloquear el objeto actual, de modo que no habrá problema de dos hilos diferentes que accedan al mismo recurso del objeto al mismo tiempo. Solo cuando un hilo acceses será el turno del siguiente hilo para acceder */ num ++; intente {Thread.sleep (1); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println (nombre + ": Usted es los hilos" + num + "usando temporizador"); }}} Problema de punto muerto del hilo:
paquete cn.galc.test;/*Este applet simula el problema del punto muerto de hilo*/public class testDeadLock implements runnable {public int flag = 1; objeto estático o1 = nuevo objeto (), o2 = nuevo objeto (); public void run () {System.out.println (Thread.CurrentThread (). getName () + "flag =" + flag); /** Después de ejecutar el programa, descubrí que el programa lo ha ejecutado e imprimido el indicador, y nunca ejecutaré la instrucción IF posterior nuevamente* El programa murió aquí, ni ejecutando ni saliendo*//* Esta es la bandera de hilo = 1*/ if (flag == 1 1) {sincronizado (o1) {/* use la palabra clave sincronizada para bloquear el objeto 01*/ try {hilo. } catch (InterruptedException e) {E.PrintStackTrace (); } sincronizado (o2) { /** El objeto O1 se ha bloqueado antes, siempre que pueda bloquear O2, puede ejecutar la operación de imprimir 1* Sin embargo, el objeto O2 no se puede bloquear aquí, porque el objeto O1 se ha bloqueado en otro hilo. }}}} /** Ambas declaraciones si aquí no se ejecutarán porque han causado el problema del punto muerto de subproceso* Flag = 1 Este hilo está esperando Flag = 0 Este hilo está desbloqueando el bloqueo del objeto O2,* y el indicador = 0 Este hilo también está esperando la bandera = 1 Este subproceso del hilo del hilo Flag = 0*/ if (flag == 0) {sincronizado (o2) {/*Aquí usamos sincronizado para bloquear el objeto o2 primero*/ try {thread.sleep (500); } catch (InterruptedException e) {E.PrintStackTrace (); } sincronizado (o1) { / * * objeto O2 ha sido bloqueado antes. Siempre que pueda bloquear O1, se puede realizar la operación de imprimir 0. Sin embargo, el objeto O1 no se puede bloquear aquí, porque el objeto O1 se ha bloqueado en otro hilo de bandera = 1. Aunque el hilo que bloquea el objeto O1 dormirá cada 500 milisegundos, todavía bloquea O1 cuando duerme*/ System.out.println ("0"); }}}} public static void main (string args []) {testDeadlock td1 = new testDeadLock (); TestDeadlock td2 = new testDeadLock (); td1.flag = 1; td2.flag = 0; Hilo t1 = nuevo hilo (TD1); Hilo t2 = nuevo hilo (TD2); t1.setName ("hilo td1"); t2.setName ("hilo td2"); t1.start (); t2.start (); }}Es mejor resolver el problema de la eliminación de muertos de hilo solo un objeto, no dos objetos al mismo tiempo.
Preguntas de productor y consumidor:
paquete cn.galc.test;/* Nombre del ejemplo: Productor-Problema de consumo* Nombre del archivo de origen: ProducerConsumer.java* Puntos clave:* 1. Inconsistencia de datos compartidos/Proteger los recursos críticos* 2. Concepto de bloqueo de objeto Java* 3. Key/Wait/Wait () y Notify () Métodos*/clase pública Producción Producción Productiva {Public static void Main (String Stry (String Stry (Stry String (Stry Worthword (Wait () () y Notify () () () Métodos nuevo SyncStack (); Runnable p = nuevo productor (pila); Ejecutable c = nuevo consumidor (pila); Hilo p1 = nuevo hilo (p); Hilo c1 = nuevo hilo (c); p1.start (); c1.start (); }} clase SyncStack {// Implementación de pilas que admiten operaciones de sincronización multithread private int index = 0; private char [] data = new Char [6]; public sincronizado void push (char c) {if (index == data.length) {try {this.wait (); } capt (interruptedException e) {}} this.notify (); datos [índice] = c; índice ++; } public sincronizado char pop () {if (index == 0) {try {this.wait (); } capt (interruptedException e) {}} this.notify (); índice--; Datos de retorno [índice]; }} El productor de clase implementa Runnable {SyncStack Stack; Productor público (SyncStack S) {stack = s; } public void run () {for (int i = 0; i <20; i ++) {char c = (char) (math.random ()*26+'a'); stack.push (c); System.out.println ("producido:"+c); intente {Thread.sleep ((int) (math.random ()*1000)); } catch (interruptedException e) {}}}} clase de consumo implementos runnables {syncStack stack; Public Consumer (SyncStack S) {stack = s; } public void run () {for (int i = 0; i <20; i ++) {char c = stack.pop (); System.out.println ("Consumo:"+C); intente {Thread.sleep ((int) (math.random ()*1000)); } catch (interruptedException e) {}}}}Lo anterior es la introducción completa a los hilos de Java. Puede combinar el primer artículo "Java debe aprender y aprender hilos (1)" para aprender, con la esperanza de que pueda ayudarlo.