首页 > 其他分享 >线程协作4

线程协作4

时间:2023-01-06 21:23:22浏览次数:36  
标签:Thread tv void class 协作 线程 new public

线程协作

生产者消费者模式

线程通信方法

解决一

管程法

package test1;
//测试生产者消费者模型--》利用缓冲区解决,管程法
public class TestPC {
    public static void main(String[] args) {
        SynContainer synContainer = new SynContainer();
        Productor productor = new Productor(synContainer);
        Consumer consumer = new Consumer(synContainer);
        productor.start();
        consumer.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 Product(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 Product{
    int id;
    public Product(int id) {
        this.id = id;
    }
}
//缓冲区
class  SynContainer{
    private int count = 0;
    Product[] products = new Product[10];//容器,产品类型的数组
    public synchronized void push(Product product){//生产者放入产品需要使用synchronized方法
        //如果容器满了则需要等待消费者消费
        if(count == 10){
            //通知生产者等待,消费者消费
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //如果没满则告诉生产者生产,丢入产品
        products[count] = product;
        count++;
        //通知消费者消费
        this.notifyAll();
    }
//消费者消费产品
public synchronized Product pop(){
        //判断能否消费
    if(count == 0){
        //通知消费者等待,生产者生产
        try {
            this.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    //如果没空则告诉消费者消费
    count--;
    Product product = products[count];

    //通知生产者生产
    this.notifyAll();
    return product;
}
}
/*有一个生产者,还有一个消费者,生产者只管生产,消费者只管消费,产品是一个对象实例,被生产者生产,又被消费者消费,还需要一个缓冲区,如果缓冲区满了,就通知消费者消费,再通知生产者等待生产,如果没满,就可以将生产的产品放入缓冲区,然后可以通知消费者消费,
再有一个消费方法,如果缓冲区空了,就通知消费者停止消费,然后如果没满,就将缓冲区中的一个产品消费,然后再通知生产者生产产品*/

信号灯法

标志位解决

package test1;
//信号灯法,标志位解决
public class Demo3 {
    public static void main(String[] args) {
        TV tv = new TV();
        new Actor(tv).start();
        new Watcher(tv).start();
    }
}
//生产者--》演员,表演
class Actor extends Thread{
    TV tv;
    public Actor(TV tv){
        this.tv = tv;
    }

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            if (i%2!= 0){
                try {
                    this.tv.action("快乐大本营");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else {
                try {
                    this.tv.action("抖音!!!!!");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
//消费者————》观众,看表演
class Watcher extends Thread{
    TV tv;
    public Watcher(TV tv){
        this.tv = tv;
    }

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            tv.watch();
        }
    }
}
//产品--》节目,表演
class TV{
    //演员表演,观众等待,true
    //观众观看,演员等待,false
    String voice;//表演的节目
    boolean flag = true;
    //表演
    public synchronized void action(String voice) throws InterruptedException {
        if (!flag){
            this.wait();
        }
        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 test1;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestPool {
    public static void main(String[] args) {
        //开启线程池,10个
        ExecutorService service = Executors.newFixedThreadPool(10);
        //提交线程实例,执行run方法
        service.submit(new Acted());
        service.submit(new Acted());
        service.submit(new Acted());
        service.submit(new Acted());
        service.submit(new Acted());
        service.shutdown();//关闭线程池
    }
}
class Acted implements Runnable
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}
package test1;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class TestA {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        B b = new B();
        new Thread(b).start();
        C c = new C();
        c.start();
        D d = new D();
        FutureTask<Integer> task = new FutureTask<Integer>(d);
        Thread thread = new Thread(task);
        thread.start();
//        thread.start();若放在task。get()后面则会出现线程阻塞
        Integer integer = task.get();
        System.out.println(integer);


    }
}
class B implements Runnable{

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "Runnable");
    }
}
class C extends Thread{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "Thread");
    }
}
class D implements Callable{
    @Override
    public Object call() throws Exception {
        System.out.println(Thread.currentThread().getName() + "Callable");
    return 100;
    }
}

标签:Thread,tv,void,class,协作,线程,new,public
From: https://www.cnblogs.com/1234sdg/p/17031599.html

相关文章

  • 线程池
    title:线程池category:JavaupdatedAt:2022-12-15T09:58:37.209ZcreatedAt:2022-12-15T09:37:21.958Z线程池介绍:Java里面线程池的顶级接口是java.util.concurrent......
  • WorkPlus平台多业务系统集成,让企业沟通协作更畅通
    搭载着5G快车,移动互联网应用得到了爆发式的增长。在线平台开会、远程教学听课、办公,企业全面走向移动办公是必然趋势。大多数企业在数字化浪潮和自身业务需求的促使下都跟......
  • m在VBLAST协作MIMO系统分部使用LDPC,Turbo,卷积三种信道编译码进行误码率matlab仿真
    1.算法描述从上面的结构可知,整个卷积编码的结构可由CRC校验,卷积编码,打孔组成,其中打孔的作用就是讲卷积编码后的码率变为所需要的码率进行发送。这里,我们采用如下的数据帧......
  • WorkPlus平台多业务系统集成,让企业沟通协作更畅通
    搭载着5G快车,移动互联网应用得到了爆发式的增长。在线平台开会、远程教学听课、办公,企业全面走向移动办公是必然趋势。大多数企业在数字化浪潮和自身业务需求的促使下都跟上......
  • 线程同步3
    线程同步并发同一对象被多个线程同时操作线程同步:处理多线程问题时,多线程访问同一个对象,并且某些线程还想修改这个对象,这时候我们就需要线程同步,线程同步其实就是一种......
  • java多线程创建一个简单的案例
    1、创建一个简单的线程,不需要去创建个RunnableThreadthread=newThread(newRunnable(){@Overridepublicvoidrun(){//todo你要执行的方法}......
  • 【Java】线程池梳理
    【Java】线程池梳理前言线程池:本质上是一种对象池,用于管理线程资源。在任务执行前,需要从线程池中拿出线程来执行。在任务执行完成之后,需要把线程放回线程池。通过线程的......
  • 多线程
    一、多线程概述1.1进程和线程概述进程:操作系统中的应用程序,一个进程就是一个应用程序。进程A和进程B的内存独立不共享资源。线程:CPU调度的最小单元,进程的一个执行流/......
  • 电脑手机互通协作软件
    功能需求:投屏、传声、设备存储/信息互通、摄像头投屏+互通(平台受限)MIUI+(内测:小米妙传)仅支持小米手机,且手机系统必须≥MIUI12.5https://www.mi.com/service/notebo......
  • 线程状态2
    线程状态2五大状态停止线程线程方法线程停止packagethread;//测试stop/*建议线程正常停止————利用次数不建议是循环*建议使用标志位,设置一个标志位*......