4.18学习总结

多线程补充

等待唤醒机制

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

路由器热备份

HSRP HSRP&#xff08;Hot Standby Routing Protocol&#xff09;热备份路由选择协议 HSRP是思科私有的协议&#xff0c;HSRP起到一个双网关热备份的一个目的&#xff0c;不考虑线路问题针对设备而言&#xff0c;一个设备挂了还有另外一台设备&#xff0c;所以双网关也叫双机…

IntelliJ IDEA运行发布传统Java Web Application项目

接 重温8年前项目部署 要求&#xff0c;如何改用IntelliJ IDEA运行发布传统 Java Web Application项目呢&#xff0c;简述步骤如下&#xff1a; 一、下载源码 源码&#xff1a;https://github.com/wysheng/kindergarten 下载后的本地项目路径&#xff1a;/Users/songjianyon…

C语言Linux vim shell命令

1. actionmotion dG删到文件尾 ggdG先到开头再删除到末尾 d^到达行首 d$到行尾 2. num action 2dd删除两行 t"向后寻找"找到&#xff0c;找到前面一个位置 f"向后寻找"找到&#xff0c;直接找到本来的位置 diw删除单词并保持在视图状态&#xff…

牛客-小乐乐与欧几里得

目录 题目 描述 输入描述&#xff1a; 输出描述&#xff1a; 示例1 示例2 解题 题目 描述 小乐乐最近在课上学习了如何求两个正整数的最大公约数与最小公倍数&#xff0c;但是他竟然不会求两个正整数的最大公约数与最小公倍数之和&#xff0c;请你帮助他解决这个问题。 …

nginx--Nginx转发真实的IP

Nginx转发真实的IP 前言给nginx.conf 设置proxy_set_headerjava 程序里获取 前言 在使用nginx的时候可能会遇到判断是不是本机在做操作&#xff0c;这样的话web端我们是可以通过ip和端口进行远程连接的这样的话我们就需要从后端获取到真实ip来判断是不是指定的机器了&#xff…

一台服务器同时启动两个版本jdk

之前Java项目都是1.8的jdk&#xff0c;在服务器部署正常使用&#xff0c;服务器配置环境变量jdk1.8版本。最近一次我用了jdk17版本&#xff0c;部署服务器后&#xff0c;遇见了jdk版本不一致报错 报错内容&#xff1a; 52指向jdk1.8,61指向jdk17&#xff0c;大概就是jdk版本不…

Arduino UNO驱动MPR121接近电容式触摸传感器控制WS2812彩灯

简介 MPR121芯片功能强大可用作触摸,电容检测,驱动LED等等.在低速扫描下可以将功 耗降低到8μA,可以处理多达12个独立的触摸板。支持I2C,几乎可以用任何微控 制器连接。可以使用ADDR引脚选择4个地址中的一个,一个I2C2线总线上共有48 个电容触摸板。使用该芯片比使用模拟输入进行…

1.为什么选择Vue框架

参考&#xff1a;百战程序员 为什么选择Vue框架 Vue是什么&#xff1f; 渐进式 JavaScript 框架&#xff0c;易学易用&#xff0c;性能出色&#xff0c;适用场景丰富的 Web 前端框架 为什么要学习Vue Vue是目前前端最火的框架之一Vue是目前企业技术栈中要求的知识点Vue可以…

2024上海国际半导体制造设备材料与核心部件展览会

2024上海国际半导体制造设备材料与核心部件展览会 2024 Shanghai International Semiconductor Manufacturing Equipment Materials and Core Components Exhibition 时间&#xff1a;2024年11月18日-20日 地点&#xff1a;上海新国际博览中心 详询主办方陆先生 I38&#…

C++三大特性之一:继承

文章目录 前言一、继承方式二、继承类型继承中构造和析构的顺序继承中的内存分配多继承语法(非重点)继承中同名静态成员的处理继承一般在哪里用到进阶&#xff1a;菱形继承和虚拟继承 总结 前言 C三大特性&#xff1a;继承、多态和封装。继承是面向对象编程的一个核心概念&…

IMUGNSS 误差状态卡尔曼滤波器(ESKF)的离散时间的ESKF 运动方程与运动过程

IMU&GNSS 误差状态卡尔曼滤波器&#xff08;ESKF&#xff09;的离散时间的ESKF 运动方程与运动过程 离散时间的ESKF 运动方程ESKF的运动过程 离散时间的ESKF 运动方程 名义状态变量的离散时间运动方程可以写为&#xff1a;&#xff08;不用考虑噪声&#xff0c;噪声在误差…

华为 2024 届实习招聘——硬件-电源机试题(四套)

华为 2024 届实习招聘——硬件-电源机试题&#xff08;四套&#xff09; 部分题目分享&#xff0c;完整版带答案(有答案&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共四套&#xff09; 获取&#xff08;WX:didadidadidida313&…