正确实现多线程

时间:2018-07-10 15:52:12

标签: java multithreading executorservice

我已经考虑了几天,并且相信我对多线程工作原理的想法是错误的。我已经咨询了用于并发的API,但仍然无法得到我的问题的答案。

如果我有一些想要返回唯一字符串的进程,并且我希望100个不同的线程来运行此进程(从而为我提供100个带有100个不同字符串的线程),我可以利用executorServices来完成此操作,对吗? / p>

然后,每个线程都有一个字符串后,我想将该字符串发送到队列中,从而用消息对队列进行爆破(再次,听起来像是executorService.submit()调用的用法)。

最后,一旦线程将消息发送到队列,我希望该线程立即开始检查另一个队列的响应(匹配其唯一字符串),如果匹配,则输出一些数据并终止。

尽管我觉得使用Executorservice可以解决我的问题,但我未能实现。我还缺少其他解决方案,还是使用此方法进行多线程处理就足够了?如果可以,怎么办?

到目前为止,

代码。实现问题后,我在sendTextMessage之后停了下来:

int arraySize = 750; //Number of hits to send out: MANIPULATE THIS IF YOU WANT TO SEND MORE


//  String[] toSend = new String[arraySize];
    String[] rfids = new String[arraySize];
    double total = 0;
    int count = 0;
    //Insert Connection information and set up clients here//

    clientSend.connectSend();
    clientRec.connectRec(); //edit to ensure credientials are corrects
//  System.out.println("Signed-in");
    StringBuffer output = new StringBuffer(); //What holds out output
    File infile = new File("infile.txt"); //Populating Rfids array

    Scanner scan = new Scanner(infile);
    for (int i = 0; i <= arraySize-1; i++) 
    {

        if(scan.hasNextLine())
        {
            rfids[i]=scan.nextLine();
//          System.out.println(rfids[i]);
        }
    }
    scan.close();
    count=0;
ExecutorService load = Executors.newFixedThreadPool(arraySize);

        Callable<String> readAndSendPrep = () ->
        {
            StringBuffer fileBasedResponse = new StringBuffer();

            String rfid = "";
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new FileReader("input.txt")); //This is the standard message that will be sent everytime, give or take
            } catch (FileNotFoundException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }    
            String line; //temp var
            for(int x = 0; x<arraySize-1;x++)
            {
                try {
                    while ((line = reader.readLine ()) != null) 
                    {


                        if (line.trim().startsWith("<MessageId>")) 
                        {
                        //  System.out.println(rf);
                            rfid = rfids[arraySize]; //not necessary i think
                            int endIndex = line.trim().indexOf("</MessageId>");
                            String messageId = line.trim().substring(11, endIndex);
                            line =  "<MessageId>" + messageId + " - " + rfids[arraySize] + "</MessageId>"; //puts unique ID in thread details

                        } 
                        else if (line.trim().startsWith("str")) 
                        {
                        //  System.out.println(allRFID[thisIndex]);
                            rfid = rfids[arraySize];
                            line = "str" + rfids[arraySize] + "str"; //Another unique ID
                        //  System.out.println("BOOM");
                        }
                        fileBasedResponse.append(line); //put the whole response to the StringBuffer object

    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            Thread.sleep(1);
            return fileBasedResponse.toString();
        };
        TimeUnit.SECONDS.sleep(10);
        Future<String> fileBasedResponse = load.submit(readAndSendPrep);
        while(!fileBasedResponse.isDone())
        {
            Thread.sleep(1);
        }

        String fileBasedResponseStr = fileBasedResponse.toString();
        Runnable sender = () ->
        {
            try {
                clientSend.sendTextMessage(fileBasedResponseStr);
            } catch (JMSException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        };

        clientSend.close(); //close connections
        clientRec.close();
        System.out.println(output.toString()); //output the results
        System.out.println(count);

0 个答案:

没有答案