zoukankan      html  css  js  c++  java
  • java笔记关于线程通信

    关于线程通信

    使用多线程编程的一个重要原因就是线程间通信的代价比较小

    --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3897773.html "谢谢-- 

    关键技术:

    yield(): Thread类的一个静态方法,用来暂停当前正在执行的线程对象,并执行其他线程

    public static void yield(){}

    代码实例:

    实现线程间的发送和接收消息

    package com.xhj.thread;
    
    /**
     * 线程之间的通信 Thread.yeild()暂停当前线程,执行其他线程
     * 
     * @author XIEHEJUN
     * 
     */
    public class CommunicationThread {
    
        /**
         * 发送线程类
         * 
         * @author XIEHEJUN
         * 
         */
        private class SendThread implements Runnable {
            private String[] products = { "java宝典", "C#宝典", "C宝典", "C++宝典",
                    "Pyhtion宝典" };
            private volatile String productName;
            private volatile boolean sendState;
    
            public String getProductName() {
                return productName;
            }
    
            public void setSendState(boolean sendState) {
                this.sendState = sendState;
            }
    
            public boolean isSendState() {
                return sendState;
            }
    
            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    while (sendState) {
                        Thread.yield();
                    }
                    productName = products[i];
                    System.out.println("发送:" + productName);
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    sendState = true;
                }
            }
        }
    
        /**
         * 接受线程类
         * 
         * @author XIEHEJUN
         * 
         */
        private class ReceiveThrend implements Runnable {
            private SendThread send;
    
            public ReceiveThrend(SendThread send) {
                this.send = send;
            }
    
            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    while (!send.isSendState()) {
                        Thread.yield();
                    }
                    System.out.println("接收:" + send.getProductName());
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    send.setSendState(false);
                }
    
            }
    
        }
    
        /**
         * 调用线程
         */
        public void useThread() {
            SendThread send = new SendThread();
            ReceiveThrend receive = new ReceiveThrend(send);
            System.out.println("线程1");
            Thread thread1 = new Thread(send);
            thread1.start();
            System.out.println("线程2");
            Thread thread2 = new Thread(receive);
            thread2.start();
        }
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            CommunicationThread communicationThread = new CommunicationThread();
            communicationThread.useThread();
    
        }
    }

    注:线程间的通信重点关注通信的内容,要确保其是同步的,而且各个线程对该资源使用后是要及时释放的,

    否则将会出现死锁现象。而且在实际应用当中,商品的信息通常都是存储在数据库中的。

    知识重在总结和梳理,只有不断地去学习并运用,才能化为自己的东西。由于本人进阶猿类时间尚短,故此博客即是我学习,工作的笔记,也是和大家交流,相互提升技术的平台~希望大家不吝赐教~~ --但管努力,莫问前程,事在人为,功不唐捐。--和佑博客园
  • 相关阅读:
    conda创建、删除、重命名环境
    jupyter notebook选择conda环境
    conda 创建tensorflow虚拟环境后,无法import tensorflow在jupyter
    labelme2coco
    MacOs 10.14.3 Matlab2018b 解决“找不到已安装的编译器 'Xcode Clang++'。错误使用mex,未找到合适的编译器”问题
    MaskRCNN 奔跑自己的数据
    labelme2coco问题:TypeError: Object of type 'int64' is not JSON serializable
    kill 掉 占据端口的进程
    关于对多层嵌套的json字符串取目标值的问题
    关于Jmeter测试移动端应用时提示非法登录,不是合法的登录设备时的解决办法
  • 原文地址:https://www.cnblogs.com/XHJT/p/3897773.html
Copyright © 2011-2022 走看看