【Java多线程】线程协作

前言

本系列记录Java从入门开始的知识点,本文主要介绍线程协作。


一、生产者和消费者问题

在这里插入图片描述

二、管程法解决

package Thread.communication;

//生产者消费者模型
public class TestPC {
    
    
    public static void main(String[] args) {
    
    
        SynContainer container = new SynContainer();

        new Productor(container).start();
        new Consumer(container).start();
    }
}

class Productor extends Thread{
    
    
    SynContainer container;

    public Productor(SynContainer container){
    
    
        this.container = container;
    }

    @Override
    public void run() {
    
    
        for (int i = 0; i < 100; i++) {
    
    
            container.push(new Chicken(i));
            System.out.println("生产了第"+i+"只鸡");
        }
    }
}

class Consumer extends Thread{
    
    
    SynContainer container;

    public Consumer(SynContainer container){
    
    
        this.container = container;
    }

    @Override
    public void run() {
    
    
        for (int i = 0; i < 100; i++) {
    
    
            System.out.println("消费了第-->"+container.pop().id+"只鸡");
        }
    }
}

class Chicken{
    
    
    int id;

    public Chicken(int id) {
    
    
        this.id = id;
    }
}

class SynContainer{
    
    
    Chicken[] chickens = new Chicken[10];
    int count = 0;

    public synchronized void push(Chicken chicken){
    
    
        //如果容器满了,就需要等待消费者消费
        if(count == chickens.length){
    
    
            //通知消费者消费,生产等待
            try {
    
    
                this.wait();
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        }

        //如果没有满,就要生产产品
        chickens[count] = chicken;
        count++;
        this.notifyAll();
    }
    public synchronized Chicken pop(){
    
    
        if(count == 0){
    
    
            try {
    
    
                this.wait();
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        }
        count--;
        Chicken chicken = chickens[count];

        this.notifyAll();
        return chicken;
    }
}

三、信号灯法

package Thread.communication;

public class TestPC2 {
    
    
    public static void main(String[] args) {
    
    
        TV tv = new TV();
        new Player(tv).start();
        new Wathcher(tv).start();
    }
}

class Player extends Thread{
    
    
    TV tv;
    public Player(TV tv){
    
    
        this.tv = tv;
    }

    @Override
    public void run() {
    
    
        for (int i = 0; i < 20; i++) {
    
    
            if(i%2 == 0){
    
    
                this.tv.play("甄嬛传");
            }else{
    
    
                this.tv.play("今年过年不收礼呀");
            }
        }
    }
}


class Wathcher extends Thread{
    
    
    TV tv;
    public Wathcher(TV tv){
    
    
        this.tv = tv;
    }

    @Override
    public void run() {
    
    
        for (int i = 0; i < 20; i++) {
    
    
            tv.watch();
        }
    }
}

class TV {
    
    
    String voice;
    boolean flag = true;

    public synchronized void play(String voice){
    
    
        if(!flag){
    
    
            try {
    
    
                this.wait();
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        }
        System.out.println("演员表演了:"+voice);
        this.notifyAll();
        this.voice = voice;
        this.flag = !this.flag;
    }

    public synchronized void watch(){
    
    
        if(flag){
    
    
            try {
    
    
                this.wait();
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        }
        System.out.println("观看了"+voice);
        this.notifyAll();
        this.flag = !this.flag;


    }
}

四、线程通信

在这里插入图片描述

五、线程池

在这里插入图片描述

package Thread.communication;

import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestPool {
    
    
    public static void main(String[] args) {
    
    
        ExecutorService service = Executors.newFixedThreadPool(10);

        service.execute(new MyThread());
        service.execute(new MyThread());
        service.execute(new MyThread());
        service.execute(new MyThread());
        service.execute(new MyThread());

        service.shutdown();

    }
}

class MyThread implements Runnable{
    
    
    @Override
    public void run() {
    
    
        for (int i = 0; i < 10; i++) {
    
    
            System.out.println(Thread.currentThread().getName()+i);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44337386/article/details/124730271