java - Java多线程并发与并行
问题描述
嗨,全世界的程序员为了了解并发与并行之间的区别,我被要求解决这个问题,但是我在这个我无法解决的问题上掉了下来,花了我很多时间,所以我来了在这里和我家有人可以帮助我。我在这里有一个问题我已经构建了一个有 4 个类的程序,其中 2 个是“客户端”(发送的 Agsrq 生成平方数,而 AgFibo 所以发送斐波那契数的序列)用于将数字发送到服务器(agclassserver 接收数据从 Agsqr 和 Agfibo 订购并以列表的形式显示它们),我添加了其他类以使服务器在这种情况下接受许多客户端(多线程),Agsqr 和 AgFibo 扮演客户端的角色。
所以这是我的问题,当我执行类(agclassserver “server”,Agsqr & AgFibo “Clients”)时,结果只给了我第一个客户端让我们说“ Agsqr ”,当我执行AgFibo它不执行但它让我再次执行Agsqr “所以我有两个 Agsqr 的结果”
这是我在这个程序中使用的所有类
农业类服务器
package smatp2;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.*;
public class agclassserver {
public static void main(String[] args) throws IOException, InterruptedException {
// TODO Auto-generated method stub
ArrayList<Integer> array = new ArrayList<Integer>();
ArrayList<ClassesHandler> classes_handler = new ArrayList<ClassesHandler>();
ExecutorService service= Executors.newFixedThreadPool(10);
boolean var=true;
int message;
try {
while(true) {
ServerSocket server = new ServerSocket(9090);
System.out.println("I waiting for the client ");
Socket socket = server.accept();// waiting for client to connect with server
ClassesHandler client = new ClassesHandler(socket);
classes_handler.add(client);
service.execute(client);
}
}catch (Exception e) {
}
}
}
阿格斯克
package smatp2;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Agsqr {
public static void main(String[] args) throws IOException, InterruptedException {
// TODO Auto-generated method stub
try {
Socket socket = new Socket ("localhost", 9090);
int n=0;
OutputStream output = socket.getOutputStream();
DataOutputStream stream = new DataOutputStream(output);
while(true) {
int result = n*n;
stream.writeInt(result);
n++;
Thread.sleep(1000);
}
}catch(Exception e) {
}
}
}
AgFibo
package smatp2;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class AgFibo extends Thread {
public synchronized void run() {
}
public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
// TODO Auto-generated method stub
try {
int number ;
int previousNumber = 0;
int nextNumber = 1;
boolean variable=false ;
Socket socket = new Socket ("localhost", 9090);
int n=0;
OutputStream output = socket.getOutputStream();
DataOutputStream stream = new DataOutputStream(output);
while(!variable){
stream.writeInt(previousNumber);
int sum = previousNumber + nextNumber;
previousNumber = nextNumber;
nextNumber = sum;
Thread.sleep(1000);
}
}catch(Exception e) {
}
}
}
类处理程序
package smatp2;
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.Collections;
public class ClassesHandler implements Runnable {
private Socket socket;
private int message;
ArrayList<Integer> array = new ArrayList<Integer>();
private DataInputStream dataInputStream;
public ClassesHandler(Socket socket) throws IOException{
this.socket = socket;
dataInputStream = new DataInputStream(socket.getInputStream());
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
while(true) {
message = dataInputStream.readInt();
array.add(message);// waiting for client to connect with server
Collections.sort(array);
System.out.println(message);
System.out.println(array);
//Thread.sleep(500);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
agclassserver /* 对不起,我忘记发布类服务器类 */
package smatp2;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.*;
public class agclassserver {
public static void main(String[] args) throws IOException, InterruptedException {
// TODO Auto-generated method stub
ArrayList<Integer> array = new ArrayList<Integer>();
ArrayList<Integer> arraySQR = new ArrayList<Integer>();
ArrayList<Integer> arrayFibo = new ArrayList<Integer>();
ArrayList<ClassesHandler> classes_handler = new ArrayList<ClassesHandler>();
ExecutorService service= Executors.newFixedThreadPool(10);
boolean var=true;
int message;
try {
ServerSocket server = new ServerSocket(9090);
while(true) {
System.out.println("I waiting for the client ");
Socket socket = server.accept();// waiting for client to connect with server
String hostName = socket.getInetAddress().getHostName();
ClassesHandler client = new ClassesHandler(socket,array,arraySQR,arrayFibo,hostName);
classes_handler.add(client);
service.execute(client);
}
}catch (Exception e) {
}
}
}
解决方案
并发与并行。
想象一下,您需要获得一本新护照,并且需要准备一份工作演示文稿。
不并行也不并行:首先你去拿护照,然后准备一个演示文稿。
不是并行的,而是并行的:你去大使馆,在椅子上等你转身。在等待的同时,您正在处理您的演示文稿。轮到您时,您关闭笔记本电脑并填写护照文件,然后您将完成您的演示文稿。
并行和并行:您在将您的妻子/丈夫送到大使馆领取护照的同时进行演示。
也有可能进行并行而不是并发。但这不符合上面的例子。示例将计算 2 个巨大整数数组的总和。使用 SIMD 可以并行执行多个整数加法,但没有并发,因为只有一个请求。
推荐阅读
- reactjs - 除非我使用超时,否则 React + Jest + Enzyme 表单 onSubmit 测试失败
- cellular-automata - 预测元胞自动机的第 n 个状态
- python - ImportError:没有名为 pygal 的模块
- excel - 插入与文档一起保存的形状(需要对象错误)
- c# - ASP.NET C# 外部 SDK 不是线程安全的
- listview - UWP Listview 冻结应用几秒钟
- mysql - 将数据加载到 mySQL 表时如何指定列名?
- scala - 我的 Scala Spark 代码不起作用,尽管 pyspark 可以正常工作
- java - WebView 无法从我在 android 9 上的网页中播放收音机中的音频
- c# - 尝试将 RoleManager 注入 ASP.NET Core 2.2 控制器时出错