4.18学习总结

news2024/12/23 15:39:16

多线程补充

等待唤醒机制

现在有两条线程在运行,其中一条线程可以创造一个特殊的数据供另一条线程使用,但这个数据的创建也有要求:在同一时间只允许有一个这样的特殊数据,那么我们要怎样去完成呢?如果用普通的多线程在理想环境下(也就是两个线程分别每个抢到一次)可以完成,但是很多时候没有这么美好,如果任意一个线程连续运行就会发生错误。我们可以让线程在运行的时候去判断这个特殊数据是否存在,然后再去根据这个结果去运行程序或是放弃占用CPU让另一个线程运行就行了。

例子:

public class dask {
    //有就是1,没有就是0;
    public static int food=0;
    //消耗十次
    public static int sum=10;
    public static Object lock=new Object();
}
public class cread implements Runnable{
    @Override
    public void run() {
        while(true){
            synchronized (dask.lock){
                if(dask.sum==0&&dask.food==0) {
                    break;
                } else {
                    if(dask.food==0){
                        dask.food=1;
                        System.out.println("做了一个数据");
                        dask.lock.notifyAll();
                    }
                    else{
                        try {
                            dask.lock.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
            }
        }
    }
}
public class food implements Runnable{

    @Override
    public void run() {
        while(true){
            synchronized (dask.lock){
                if(dask.sum==0&&dask.food==0) {
                    break;
                } else {
                    if(dask.food==1){
                        dask.sum--;
                        dask.food=0;
                        System.out.println("还可以使用"+dask.sum+"次");
                        dask.lock.notifyAll();
                    }
                    else{
                        try {
                            dask.lock.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
            }
        }
    }
}
public class Main {
    public static void main(String[] args) {
        food food=new food();
        Thread thread=new Thread(food);
        thread.start();
        cread cread=new cread();
        Thread thread1=new Thread(cread);
        thread1.start();
    }
}

网络编程

import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class TCPin implements Runnable{
    private final Socket socket;
    private final String name;

    public TCPin(Socket socket, String name) {
        this.socket = socket;
        this.name = name;
    }

    @Override
    public void run() {
        TCPout tcPout=new TCPout(socket,name);
        Thread thread= new Thread(tcPout);
        thread.start();
        char []chars=new char[1000];
        while(true){
            InputStreamReader inputStreamReader= null;
            try {
                inputStreamReader = new InputStreamReader(socket.getInputStream());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            int x;
            try {
                x=inputStreamReader.read(chars);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            System.out.println(new String(chars,0,x));
        }
    }

}
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class TCPout implements Runnable{
    private final Socket socket;
    private final String name;

    public TCPout(Socket socket, String name) {
        this.socket = socket;
        this.name = name;
    }

    @Override
    public void run() {
        Scanner scanner=new Scanner(System.in);
        OutputStream outputStream= null;
        try {
            outputStream = socket.getOutputStream();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        while(true){
            String s=name+":\t"+scanner.nextLine();
            try {
                outputStream.write(s.getBytes());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

}
import java.io.IOException;
import java.net.Socket;

public class TCPclient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 1080);
        TCPin tcPin=new TCPin(socket,"用户1");
        tcPin.run();
    }
}
import java.io.IOException;
import java.net.Socket;

public class TCPclient1 {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 1080);
        TCPin tcPin=new TCPin(socket,"用户2");
        tcPin.run();
    }
}
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class serverin implements Runnable{
    private final Socket socket;
    private final String name;

    public serverin(Socket socket, String name) {
        this.socket = socket;
        this.name = name;
    }

    @Override
    public void run() {
        char []chars=new char[1000];
        while(true){
            InputStreamReader inputStreamReader= null;
            try {
                inputStreamReader = new InputStreamReader(socket.getInputStream());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            int x;
            try {
                x=inputStreamReader.read(chars);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            System.out.println(new String(chars,0,x));
        }
    }

}
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;

public class TCPserver {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket=new ServerSocket(1080);
        ArrayList<Socket> s=new ArrayList<>();
        int x=0;
        while(true){
            Socket socket=serverSocket.accept();
            s.add(socket);
            System.out.println(x);
            Thread thread=new Thread(new serverin(socket,"服务器"));
            thread.start();
            x++;
            if(x==2)
                break;
        }
        Scanner scanner=new Scanner(System.in);
        OutputStream outputStream= null;
        while(true) {
            String b = "服务器" + ":\t" + scanner.nextLine();
            for (int i = 0; i < s.size(); i++) {
                try {
                    outputStream = s.get(i).getOutputStream();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }

                try {
                    outputStream.write(b.getBytes());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

该程序实现了多个客户端与服务端的多次通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1606232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生Kubernetes: K8S 1.29版本 部署Kuboard

目录 一、实验 1.环境 2.K8S 1.29版本 部署Kuboard (第一种方式) 3.K8S 1.29版本 部署Kuboard (第二种方式) 4.K8S 1.29版本 使用Kuboard 二、问题 1.docker如何在node节点间移动镜像 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构版本IP备注ma…

Java学习-Module的概念和使用、IDEA的常用设置及常用快捷键

Module的概念和使用 【1】在Eclipse中我们有Workspace (工作空间)和Project (工程)的概念&#xff0c;在IDEA中只有Project (工程)和Module (模块)的概念。 这里的对应关系为: IDEA官网说明: An Eclipse workspace is similar to a project in IntelliJ IDEA An Eclipse pr…

二刷大数据(三)- Flink1.17

目录 Flink概念与SparkStreaming区别分层API 工作流程部署模式**Local Mode****Standalone Mode****YARN Mode****Kubernetes Mode****Application Mode** 运行架构stand alone 核心概念算子链任务槽 窗口窗口**窗口的目的与作用****时间窗口&#xff08;Time Windows&#xff…

ARouter之kotlin build.gradle.kts

ARouter之kotlin build.gradle.kts kotlin的配置需要用到kapt 项目的build.gradle.kts plugins {id("com.android.application") version "8.1.2" apply falseid("org.jetbrains.kotlin.android") version "1.9.0" apply falseid(&…

typecho博客的相对地址实现

typecho其中的博客地址,必须写上绝对地址,否则在迁移网址的时候会出现问题,例如页面记载异常 修改其中的 typecho\var\Widget\Options\General.php 中的165行左右, /** 站点地址 */if (!defined(__TYPECHO_SITE_URL__)) {$siteUrl new Form\Element\Text(siteUrl,null,$this-…

OpenCV从入门到精通实战(五)——dnn加载深度学习模型

从指定路径读取图像文件、利用OpenCV进行图像处理&#xff0c;以及使用Caffe框架进行深度学习预测的过程。 下面是程序的主要步骤和对应的实现代码总结&#xff1a; 1. 导入必要的工具包和模型 程序开始先导入需要的库os、numpy、cv2&#xff0c;同时导入utils_paths模块&…

【opencv】dnn示例-person_reid.cpp 人员识别(ReID,Re-Identification)系统

ReID(Re-Identification&#xff0c;即对摄像机视野外的人进行再识别) 0030_c1_f0056923.jpg 0042_c5_f0068994.jpg 0056_c8_f0017063.jpg 以上为输出结果&#xff1a;result文件夹下 galleryLIst.txt queryList.txt 模型下载&#xff1a; https://github.com/ReID-Team/ReID_e…

华为手机p70即将上市,国内手机市场或迎来新局面?

4月15日&#xff0c;华为官宣手机品牌全新升级&#xff0c;p系列品牌升级为Pura。华为P70系列手机预计将于2024年第一季度末发布&#xff0c;而网友也纷纷表示期待p70在拍照、性能上的全新突破。 网友们对华为P70系列的热情高涨&#xff0c;也印证了国内高端手机市场的潜力巨大…

吴恩达机器学习笔记:第 8 周-13 聚类(Clustering)13.1-13.2

目录 第 8 周 13、 聚类(Clustering)13.1 无监督学习&#xff1a;简介 第 8 周 13、 聚类(Clustering) 13.1 无监督学习&#xff1a;简介 在这个视频中&#xff0c;我将开始介绍聚类算法。这将是一个激动人心的时刻&#xff0c;因为这是我们学习的第一个非监督学习算法。我们…

数仓建模—数据仓库初识

数仓建模—数据仓库初识 数据仓库之父Bill Inmon在1991年出版的"Building the Data Warehouse"一书中所提出的定义被广泛接受 数据仓库&#xff08;Data Warehouse&#xff09;是一个面向主题的&#xff08;Subject Oriented&#xff09;、集成的&#xff08;Integ…

SOLIDWORKS Composer如何使用3D工具实现更真实的动画效果

当我们使用SOLIDWORKS composer创建动画时&#xff0c;往往会涉及到产品的安装与拆解&#xff0c;现实生活中我们在拆卸组装产品的时候&#xff0c;我们往往需要一些工具的协助&#xff0c;比如扳手、螺丝刀等等&#xff0c;那么我们如何在虚拟动画中也将这一过程以逼真的形式展…

【网站项目】新生报到系统小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【XR806开发板试用】XR806在U8G2上增加MQTT+JSON控制

一、前言 U8G2移植参见之前写的文章 https://aijishu.com/a/1060000000292472本次增加MQTTJSON是站在大佬的肩膀上&#xff0c;参见 https://aijishu.com/a/1060000000284320CJSON的使用&#xff0c;参见 https://blog.csdn.net/fengxinlinux/article/details/53121287 二、成…

Hive进阶(2)----HDFS写入数据流程(赋图助君理解)

HDFS写入数据流程 一、写入流程 1、 Client向NameNode发起RPC请求&#xff0c;来确定请求文件block所在的位置&#xff1b; 2、 NameNode会视情况返回文件的部分或者全部block列表&#xff0c;对于每个block&#xff0c;NameNode都会返回含有该block副本的DataNode地址&…

如何部署npm私有仓库以及在项目中如何使用

如何部署npm私有仓库以及在项目中如何使用 为什么要部署npm私有仓库&#xff1f; 安全性&#xff1a;私有仓库允许团队存放内部研发的、不宜公开发布的代码包&#xff0c;只对特定用户或者团队可见和可用&#xff0c;从而保护公司的知识产权和商业秘密。模块的复用性&#xf…

友元,const成员,static成员变量,static成员函数

友元&#xff1a; friend关键字: 1.友元函数&#xff1a; 语法&#xff1a; friend在类中修饰一个函数。 那么这个函数定义到全局时仍可以访问该类的私有成员的。 (定义时不需要用friend&#xff0c;而是需要在全局定义前&#xff0c;在要使用的成员的类里进行声明&#xff…

备战面试K8S

备战面试&&K8S Kubernetes关于DockerDocker的优缺点分析 WebAssemblyWebAssembly与Container比较 CtrCrictlCtr和CriCtl的区别 Pod生命周期PodConditions容器状态Pod容器组成生命周期的流程 Kubelet EFK日志采集工具的优缺点 Kubernetes 容器运行接口 Container Runti…

Tensorflow小技巧01:检测本地Tensorflow的版本

前言&#xff1a; 以Pycharm为例&#xff0c;Windwos10系统&#xff0c;检测本地环境的Tensorflow的版本&#xff1a; 1 打开Pycharm窗口 2 在窗口中输入&#xff1a; pythonPython 3.9.5 (tags/v3.9.5:0a7dcbd, May 3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win…

ChatGPT与Python-GEE融合,遥感云大数据分析、管理与可视化

掌握Earth Engine的实际应用能力&#xff0c;以Python为基础&#xff0c;结合实例讲解平台搭建、影像数据分析、经典应用案例、本地与云端数据管理&#xff0c;以及云端数据论文出版级可视化等技能。 为提高教学质量&#xff0c;将融入ChatGPT 4、Claude Opus、Gemini、文心一…

Centos7.9 脚本一键部署nextcloud,配置Nginx代理Https。

目录 一键安装nextcloud 出现错误TypeError Cannot read properties of undefined (reading ‘writeText‘) 生成自签名SSL证书 编辑Nginx配置文件 启动Nginx 一键安装nextcloud 本脚本参考文章&#xff0c;本文较长建议先看完在操作&#xff01;&#xff01;&#xff01;…