zoukankan      html  css  js  c++  java
  • JavaSE:线程

    1.  图解

    2.  代码示例

    <1>  仓库类

     1 public class StoreHouse {
     2     private int cnt = 0; // 用于记录产品的数量
     3 
     4     public synchronized void produceProduct() {
     5         notify();
     6         if (cnt < 10) {
     7             System.out.println("线程" + Thread.currentThread().getName() + "正在生产第" + (cnt+1) + "个产品...");
     8             cnt++;
     9         } else {
    10             try {
    11                 wait();
    12             } catch (InterruptedException e) {
    13                 e.printStackTrace();
    14             }
    15         }
    16     }
    17 
    18     public synchronized void consumerProduct() {
    19         notify();
    20         if (cnt > 0) {
    21             System.out.println("线程" + Thread.currentThread().getName() + "消费第" + cnt + "个产品");
    22             cnt--;
    23         } else {
    24             try {
    25                 wait();
    26             } catch (InterruptedException e) {
    27                 e.printStackTrace();
    28             }
    29         }
    30     }
    31 }

    <2>  生产者线程

     3 /**
     4  * 编程实现生产者线程,不断地生产产品
     5  */
     6 public class ProduceThread extends Thread {
     7     // 声明一个仓库类型的引用作为成员变量,是为了能调用调用仓库类中的生产方法   合成复用原则
     8     private StoreHouse storeHouse;
     9     // 为了确保两个线程共用同一个仓库
    10     public ProduceThread(StoreHouse storeHouse) {
    11         this.storeHouse = storeHouse;
    12     }
    13 
    14     @Override
    15     public void run() {
    16         while (true) {
    17             storeHouse.produceProduct();
    18             try {
    19                 Thread.sleep(1000);
    20             } catch (InterruptedException e) {
    21                 e.printStackTrace();
    22             }
    23         }
    24     }
    25 }

    <3>  消费者线程

     1 public class ConsumerThread extends Thread {
     2     // 声明一个仓库类型的引用作为成员变量,是为了能调用调用仓库类中的生产方法   合成复用原则
     3     private StoreHouse storeHouse;
     4     // 为了确保两个线程共用同一个仓库
     5     public ConsumerThread(StoreHouse storeHouse) {
     6         this.storeHouse = storeHouse;
     7     }
     8 
     9     @Override
    10     public void run() {
    11         while (true) {
    12             storeHouse.consumerProduct();
    13             try {
    14                 Thread.sleep(100);
    15             } catch (InterruptedException e) {
    16                 e.printStackTrace();
    17             }
    18         }
    19     }
    20 }

    <4>  StoreHouseTest.java

    public class StoreHouseTest {
    
        public static void main(String[] args) {
    
            // 创建仓库类的对象
            StoreHouse storeHouse = new StoreHouse();
            // 创建线程类对象并启动
            ProduceThread t1 = new ProduceThread(storeHouse);
            ConsumerThread t2 = new ConsumerThread(storeHouse);
            t1.start();
            t2.start();
        }
    }
  • 相关阅读:
    【微信公众平台开发】公布动态新闻好帮手UEditor富文本
    Software Development and Newton&#39;s Laws of Motion
    组队赛第二场:字符串哈希+DP
    [ACM] hdu 4418 Time travel (高斯消元求期望)
    解决IE11无法下载文件的问题
    LeetCode :: Binary Tree Zigzag Level Order Traversal [tree, BFS]
    用Stack实现对多线程的管理范例
    同事的Excel中的图片突然不能选择
    HDU 1272 小希的迷宫 并查集
    将Datagridview中的数据导出至Excel中
  • 原文地址:https://www.cnblogs.com/JasperZhao/p/14913002.html
Copyright © 2011-2022 走看看