首页 > 解决方案 > 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) {
                
                
            }   
                


    }

}

标签: javamultithreadingconcurrencyparallel-processing

解决方案


并发与并行。

想象一下,您需要获得一本新护照,并且需要准备一份工作演示文稿。

不并行也不并行:首先你去拿护照,然后准备一个演示文稿。

不是并行的,而是并行的:你去大使馆,在椅子上等你转身。在等待的同时,您正在处理您的演示文稿。轮到您时,您关闭笔记本电脑并填写护照文件,然后您将完成您的演示文稿。

并行和并行:您在将您的妻子/丈夫送到大使馆领取护照的同时进行演示。

也有可能进行并行而不是并发。但这不符合上面的例子。示例将计算 2 个巨大整数数组的总和。使用 SIMD 可以并行执行多个整数加法,但没有并发,因为只有一个请求。


推荐阅读