En cuarto lugar, la comunicación entre la base de la rosca multithreading java

En primer lugar, ¿qué es la comunicación entre múltiples hilos

1. Concepto: las comunicaciones entre múltiples hilos, múltiples hilos de hecho, el funcionamiento de los mismos recursos, pero diferentes operaciones de movimiento.

En segundo lugar, las comunicaciones multi-hilo de simulación cuestiones emergentes

1. Demanda: una primera escritura hilo (entrada) del usuario, otra toma de hilo de leer (hacia fuera) el usuario para lograr una lectura, una operación de escritura.

2. Código

// 共享对象
class Res {
    // 姓名
    public String name;
    // 性别
    public String sex;
}
// 生产这线程
class IntThread extends Thread {
    public Res res;
    public IntThread(Res res) {
        this.res = res;
    }
    @Override
    public void run() {
        int count = 0; // 1
        while (true) {
            if (count == 0) {
                res.name = "小红";
                res.sex = "女";
            } else {
                res.name = "小明";
                res.sex = "男";
            }
            count = (count + 1) % 2;// 0 1 0 1 0 1
        }
    }
}
// 读取线程
class OutThread extends Thread {
    public Res res;
    public OutThread(Res res) {
        this.res = res;
    }
    @Override
    public void run() {
        while (true) {
            System.out.println(res.name + "," + res.sex);
        }
    }
}
public class Test0001 {
    public static void main(String[] args) throws InterruptedException {
        Res res = new Res();
        IntThread intThread = new IntThread(res);
        OutThread outThread = new OutThread(res);
        intThread.start();
        outThread.start();
    }
}

3. resultados

Nota: Los datos no se confundan, causando problemas de hilo de seguridad

En tercer lugar, la simulación de comunicaciones multi-hilo para resolver el problema

1. Código

// 共享对象
class Res {
    // 姓名
    public String name;
    // 性别
    public String sex;
    // 为true情况下 允许读,不能写
    // 为false情况下 允许写,不能读。
    public boolean flag = false;
}
// 生产这线程
class IntThread extends Thread {
    public Res res;

    public IntThread(Res res) {
        this.res = res;
    }
    @Override
    public void run() {
        int count = 0; // 1
        while (true) {
            synchronized (res) {
                if (res.flag) {
                    try {
                        res.wait();// 釋放当前锁对象
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
                }
                if (count == 0) {
                    res.name = "小红";
                    res.sex = "女";
                } else {
                    res.name = "小明";
                    res.sex = "男";
                }
                count = (count + 1) % 2;// 0 1 0 1 0 1
                res.flag = true;// 标记当前线程为等待
                res.notify();// 唤醒被等待的线程
            }
        }
    }
}
// 读取线程
class OutThread extends Thread {
    public Res res;

    public OutThread(Res res) {
        this.res = res;
    }
    @Override
    public void run() {
        while (true) {
            synchronized (res) {
                try {
                    if (!res.flag) {
                        res.wait();
                    }
                    Thread.sleep(1000);
                } catch (Exception e) {
                    // TODO: handle exception
                }
                System.out.println(res.name + "," + res.sex);
                res.flag = false;
                res.notify();
            }
        }
    }
}
public class Test0001 {
    public synchronized static void main(String[] args) throws InterruptedException {
        Res res = new Res();
        IntThread intThread = new IntThread(res);
        OutThread outThread = new OutThread(res);
        intThread.start();
        outThread.start();
    }
}

2. resultados

3. Analizar

3.1. Debido a que implica el bloqueo de objetos, que deben ser colocados en el uso sincronizado. Espere, Notificar Asegúrese de utilizar el interior sincronizada.

3.2.Wait hilo debe tentativa está ejecutando actualmente, y liberar el bloqueo de recursos, de modo que otros hilos pueden tener la oportunidad de correr.

Nota: Asegúrese de sincronización de uso de hilo, y es el mismo recurso de bloqueo

En cuarto lugar, el bienestar pequeña

Y dormir la diferencia 1.wait

Para el método sleep (), en primer lugar hay que saber que pertenece clase Thread. Y el método wait (), el objeto pertenece a la clase.

sueño () método da como resultado un programa para suspender el tiempo especificado, por lo que la CPU de los otros hilos, pero sus restos fueron estado, cuando el tiempo especificado es de hasta reanudará automáticamente la operación de vigilancia.

Durante la llamada al método sleep (), el hilo no liberará el bloqueo de objeto.

Y cuando la llamada al método wait (), el hilo va a renunciar a la cerradura objeto, a la espera para este objeto a la espera de la piscina de bloqueo, sólo después de llamar a notificar por este método () del objeto de la rosca antes de mover la piscina bloqueo objeto listo para adquirir el bloqueo de objetos en funcionamiento .

En quinto lugar, el final de la

¡¡¡Siempre mantén la fe!!!

Publicados 122 artículos originales · ganado elogios 64 · Vistas a 50000 +

Supongo que te gusta

Origin blog.csdn.net/chenmingxu438521/article/details/103777197
Recomendado
Clasificación