首页 > 其他分享 >线程通信

线程通信

时间:2022-12-18 10:44:24浏览次数:46  
标签:ShareResource resource Thread 通信 共享资源 线程 public

一 概述:

多个线程执行不同任务获取同一个资源,此时需要线程通信来帮助解决线程之间对同一个变量的使用或操作。(避免对同一共享变量的争夺,导致死锁)

于是我们引出了等待唤醒机制:(wait()、notify())
就是在一个线程进行了规定操作后,就进入等待状态(wait),等待其他线程执行完他们的指定代码过后,再将其唤醒(notify);

二 案例:(生产者和消费者模式)

多个线程直接能够更好的沟通,协调配合工作
操作步骤:
1.生产者和消费者都去操作共享的资源
2.定义共享的资源
3.生产者和消费者进行加锁和解锁操作
wait() 和 notify()方法

共享资源

public class ShareResource {
private String name;
private int age;

//表示共享资源的状态(初始是空的)
boolean flag = true;

//生产者向共享资源中存储数据
public synchronized void push(String name, int age) {

    while (!flag) {
        try {
            this.wait();        //如果资源不为空,则生产者等待
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    //生产开始
    this.name = name;
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    this.age = age;
    System.out.println("生产者是:" + this.name + ":" + this.age);

    //生产结束
    this.flag = false;      //将共享资源设置为不空
    this.notify();          //生产者唤醒消费者
}

//消费者向共享资源中取出数据
public synchronized void pull() {

    while (flag) {
        try {
            this.wait();        //如果资源为空,则消费者等待
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("消费者是:" + this.name + ":" + this.age);

    this.flag = true;   //将共享资源状态设置为空
    this.notify();      //消费者唤醒生产者
}

}

生产者

public class Product implements Runnable {

ShareResource resource = null;

public Product(ShareResource resource) {
    this.resource = resource;
}

@Override
public void run() {
    for (int i = 0; i < 20; i++) {
        if (i % 2 == 0) {
            resource.push("张三", 23);
        } else {
            resource.push("李四", 24);
        }
    }
}

}

消费者

public class Consumer implements Runnable {

ShareResource resource = null;

public Consumer(ShareResource resource) {
    this.resource = resource;
}

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

}

测试类

public class Test6 {
public static void main(String[] args) {
    //创建共享资源对象
    ShareResource resource=new ShareResource();

    //创建自定义线程对象
    Product product=new Product(resource);
    Consumer consumer=new Consumer(resource);

    //创建线程对象
    Thread t1=new Thread(product);
    Thread t2=new Thread(consumer);

    //启动线程
    t1.start();
    t2.start();
}

}

标签:ShareResource,resource,Thread,通信,共享资源,线程,public
From: https://www.cnblogs.com/Sco-/p/16990080.html

相关文章

  • Linux进程通信
    写在前面今天主要的任务就是知道什么是进程通信?进程通信是如何实现的?前面我们学习了基础IO,再往前看又学习进程的相关的概念,那么今天我们通过进程的通信来把他们用起来.......
  • redis之单线程
    一、redis为何是单线程官方给出的答案:因为Redis是基于内存的操作,CPU不会成为Redis的瓶颈,而最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不......
  • ThreadPoolExecutor创建线程池启动项目报错问题
    ThreadPoolExecutor创建线程,如下代码:ThreadPoolExecutorthreadPoolExecutor=newThreadPoolExecutor(Runtime.getRuntime().availableProcessors()+1,20,......
  • 线程常用方法
    线程常用方法介绍1、方法概述方法说明static功能说明注意start()启动一个新线程,在新的线程运行run方法中的代码start方法只是让线程进入就绪,里面代码不一......
  • Python之threading: 带你了解多线程的强大威力!
    前言什么是多线程多线程是指在一个程序中同时创建和使用多个执行流(thread)来执行不同的任务。这样多个任务就可以同时进行,从而提高程序的执行效率。在python使用多线......
  • 创建线程的4种方法
    线程创建方法1、继承Thread,重写run方法 privatestaticvoidone(){classTextendsThread{@Overridepublicvo......
  • python多线程修改共享全局变量不安全
    当需要对全局变量进行更改时,则会出现不安全的情况 #-*-coding:utf-8-*-"""================================================================================......
  • 第十四章《多线程》第8节:线程池
    系统启动一个线程的成本是比较高的,因为启动线程的操作要与操作系统交互。如果程序中需要创建大量生存期较短的线程,那么使用线程池将会大幅度提高程序的运行效率。线程池中保......
  • 第十四章《多线程》第9节:ThreadLocal类
    如果多个线程共用一个对象,那么这个对象的属性值对于这些线程都是相同的。例如有一个a对象,它有一个x属性,如果x属性的值是1,那么对于任何一个线程而言,a对象的x属性都是1。但有......
  • 第十四章《多线程》第7节:线程组
    多个线程可以组成一个线程组,线程组可以对一批线程统一调度和管理,也就是说,控制一个线程组相当于控制这个线程组中所有的线程。Java语言以ThreadGroup这个类来表示线程组这个......