Requisito previo: subprocesamiento múltiple
Dado un número entero N, la tarea es escribir un programa Java para imprimir los primeros N números naturales en orden creciente usando dos hilos .
Ejemplos:
Entrada: N = 10
Salida: 1 2 3 4 5 6 7 8 9 10Entrada: N = 18
Salida: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Enfoque: La idea es crear dos hilos e imprimir números pares con un hilo y números impares con otro hilo. A continuación se muestran los pasos:
- Cree dos subprocesos T1 y T2 usando la siguiente sintaxis, donde T1 y T2 se usan para imprimir números pares e impares respectivamente.
Thread T1 = new Thread(new Runnable() {
public void run() { mt.printEvenNumber(); }
});Thread T2 = new Thread(new Runnable() {
public void run() { mt.printOddNumber(); }
});donde
printOddNumber() se usa para imprimir todos los números impares hasta N ,
printEvenNumber() se usa para imprimir todos los números pares hasta N . - Mantenga una variable de contador global e inicie ambos subprocesos con la siguiente función:
T1.inicio();
T2.inicio(); - Si el contador es par en el subproceso T1 , espere a que el subproceso T2 imprima ese número par. De lo contrario, imprima ese número impar, incremente el contador y notifique al Thread T2 usando la función notificar() .
- Si el contador es impar en el hilo T2 , espere a que el hilo T1 imprima ese número impar. De lo contrario, imprima ese número par, incremente el contador y notifique al Subproceso T1 usando la función notificar().
Java
// Java program for the above approach public class GFG { // Starting counter int counter = 1; static int N; // Function to print odd numbers public void printOddNumber() { synchronized (this) { // Print number till the N while (counter < N) { // If count is even then print while (counter % 2 == 0) { // Exception handle try { wait(); } catch ( InterruptedException e) { e.printStackTrace(); } } // Print the number System.out.print(counter + " "); // Increment counter counter++; // Notify to second thread notify(); } } } // Function to print even numbers public void printEvenNumber() { synchronized (this) { // Print number till the N while (counter < N) { // If count is odd then print while (counter % 2 == 1) { // Exception handle try { wait(); } catch ( InterruptedException e) { e.printStackTrace(); } } // Print the number System.out.print( counter + " "); // Increment counter counter++; // Notify to 2nd thread notify(); } } } // Driver Code public static void main(String[] args) { // Given Number N N = 10; // Create an object of class GFG mt = new GFG(); // Create thread t1 Thread t1 = new Thread(new Runnable() { public void run() { mt.printEvenNumber(); } }); // Create thread t2 Thread t2 = new Thread(new Runnable() { public void run() { mt.printOddNumber(); } }); // Start both threads t1.start(); t2.start(); } }
1 2 3 4 5 6 7 8 9 10
Complejidad temporal: O(N)
Espacio auxiliar: O(1)