Многопоточный бенчмарк в Java - PullRequest
1 голос
/ 20 января 2011

Я занимаюсь научным ярмарочным проектом, в котором я проверяю, насколько дополнительные вычислительные ядра увеличивают скорость вычислений.Это многоядерный тест, который я запрограммировал до сих пор, но есть проблемы."Тема # .join ();"все строки выкидывают ошибки.Может кто-нибудь помочь исправить это?Имейте в виду, что я новичок, поэтому не могли бы вы объяснить в очень простых терминах, как это исправить, или покажите мне, вставив исправленный код в свой ответ.Вот что у меня есть:

import java.util.Calendar;
import java.text.SimpleDateFormat;
import java.util.Scanner;
import java.text.*;
import java.util.concurrent.*;

public class SciFair 
{

    /**
     * Numa Robertson
     * 1/13/11
     * Science Fair 2011
     */

    public static String now(String dateFormat) {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        return sdf.format(cal.getTime());
    }

    public static void main(String[] args) {
        Scanner dataIn = new Scanner(System.in);
        DecimalFormat timeInSeconds = new DecimalFormat("##.###");

        System.out.println("Are you ready to begin the benchmark? ");
        String response = dataIn.nextLine();
        double endNum = 0;

        if(response.equals("Yes") || response.equals("yes") || response.equals("Ok") || response.equals("ok")) {

            System.out.println("Benchmark starting at " + SciFair.now("H:mm:ss:SSS") + ".");

            String startTimeHours = SciFair.now("H");
            String startTimeMinutes = SciFair.now("mm");
            String startTimeSeconds = SciFair.now("ss");
            String startTimeMilliseconds = SciFair.now("SSS");
            double startTimeHoursNumFormat = Double.valueOf(startTimeHours.trim()).doubleValue();
            double startTimeMinutesNumFormat = Double.valueOf(startTimeMinutes.trim()).doubleValue();
            double startTimeSecondsNumFormat = Double.valueOf(startTimeSeconds.trim()).doubleValue();
            double startTimeMillisecondsNumFormat = Double.valueOf(startTimeMilliseconds.trim()).doubleValue();
            double startHoursInSeconds = (startTimeHoursNumFormat * 3600);
            double startMinutesInSeconds = (startTimeMinutesNumFormat * 60);
            double startMillisecondsInSeconds = (startTimeMillisecondsNumFormat / 1000);
            double startTotalSeconds = (startHoursInSeconds + startMinutesInSeconds + startTimeSecondsNumFormat + startMillisecondsInSeconds);

            Thread thread1 = new Thread() {
                public void run() {
                    double endNum = 0;
                    double num = 5832544225416546445465465465465465448412168546725.2655236355335649499923164684654345649874181221173246189579162421579584572121334216957951462175918894199993642446445548521652158975;

                    for(double numberRun = 0; numberRun <= 1666666660; numberRun++) {
                        endNum = endNum+((num * 58445246411658545558.458561435435385465146445641894984984651321616548946132131654984 + 26564.6351648941654984156 / 321654984616321654654984365.3216548974165416484 + 216541648165141654.23164584961321316546844651 * 65616484316541486541.1654484646546576746862468546576248645814668585145181 / 111.3216516543464545795479884754424759845 * 3467247954975472171276545789595.4721756147541715715157145715145714514748717521 / 31654688498445132154.3215449848489461531654 * 61654984132165465484464131321145644684.3164846434654648446546546465456465465414321165118547521569845258547566352544 / 32136546465434654654484843131.3164484151515121211554464547951126758178571454164175415417584175664) / 2431276251975915431326725157958456157321624621765419.4321672175951247316726451751487465462645754579517232172757497516373127651975167516715);    
                    }
                }
            };


            Thread thread2 = new Thread() {
                public void run() {
                    double endNum = 0;
                    double num = 5832544225416546445465465465465465448412168546725.2655236355335649499923164684654345649874181221173246189579162421579584572121334216957951462175918894199993642446445548521652158975;

                    for(double numberRun = 0; numberRun <= 1666666660; numberRun++) {
                        endNum = endNum+((num * 58445246411658545558.458561435435385465146445641894984984651321616548946132131654984 + 26564.6351648941654984156 / 321654984616321654654984365.3216548974165416484 + 216541648165141654.23164584961321316546844651 * 65616484316541486541.1654484646546576746862468546576248645814668585145181 / 111.3216516543464545795479884754424759845 * 3467247954975472171276545789595.4721756147541715715157145715145714514748717521 / 31654688498445132154.3215449848489461531654 * 61654984132165465484464131321145644684.3164846434654648446546546465456465465414321165118547521569845258547566352544 / 32136546465434654654484843131.3164484151515121211554464547951126758178571454164175415417584175664) / 2431276251975915431326725157958456157321624621765419.4321672175951247316726451751487465462645754579517232172757497516373127651975167516715);    
                    }
                }
            };

            //Snip out a bunch of copy/paste thread implementations



            thread1.start();
            thread2.start();
            thread3.start();
            thread4.start();
            thread5.start();
            thread6.start();

            thread1.join();
            thread2.join();
            thread3.join();
            thread4.join();
            thread5.join();
            thread6.join();


            String endTimeHours = SciFair.now("H");
            String endTimeMinutes = SciFair.now("mm");
            String endTimeSeconds = SciFair.now("ss");
            String endTimeMilliseconds = SciFair.now("SSS");
            double endTimeHoursNumFormat = Double.valueOf(endTimeHours.trim()).doubleValue();
            double endTimeMinutesNumFormat = Double.valueOf(endTimeMinutes.trim()).doubleValue();
            double endTimeSecondsNumFormat = Double.valueOf(endTimeSeconds.trim()).doubleValue();
            double endTimeMillisecondsNumFormat = Double.valueOf(endTimeMilliseconds.trim()).doubleValue();
            double endHoursInSeconds = (endTimeHoursNumFormat * 3600);
            double endMinutesInSeconds = (endTimeMinutesNumFormat * 60);
            double endMillisecondsInSeconds = (endTimeMillisecondsNumFormat / 1000);
            double endTotalSeconds = (endHoursInSeconds + endMinutesInSeconds + endTimeSecondsNumFormat + endMillisecondsInSeconds);

            double elapsedTime = (endTotalSeconds - startTotalSeconds);

            System.out.println("\nThe benchmark is complete at " + SciFair.now("H:mm:ss:SSS") + ", and the end result is " + endNum + ".");
            System.out.println("\nThe benchmark was run in " + timeInSeconds.format(elapsedTime) + " seconds.");
        } else {
            System.out.println("\nPlease restart the program when you are ready to benchmark.");
        }
    }
}

Ответы [ 2 ]

1 голос
/ 20 января 2011

Проблема в том, что Thread # join () генерирует проверенное исключение, и компилятор хочет, чтобы вы обработали это исключение. Проверенные исключения обычно обрабатываются либо сообщением о том, что ваш метод / функция может вызвать исключение, либо перехватом исключения.

В вашем конкретном случае, поскольку вы просто пишете простое приложение для тестирования производительности, самое простое решение - просто указать, что ваш код может выдать исключение.

public static void main(String[] args) throws InterruptedException {

Примером обработки исключения может быть что-то вроде этого:

try {
    thread1.join();
    thread2.join();
    thread3.join();
    thread4.join();
    thread5.join();
    thread6.join();
} catch (InterruptedException e) {
    Thread.currentThread().interrupt(); //This is a best practice for handling the InterruptedException only
    logger.log("The thread has been interrupted and should now exit quickly and cleanly. Processing may be incomplete.");
}
0 голосов
/ 20 января 2011

Я предлагаю вам воспользоваться услугой ExecutorService.Я надеюсь, вы увидите, что это делает управление потоками намного проще.

public static void main(String[] args) throws InterruptedException {
int threads = 6;

System.out.println("Benchmark starting at " + new Date());
long start = System.nanoTime();
ExecutorService es = Executors.newCachedThreadPool();
for (int i = 0; i < threads; i++)
    es.submit(new Runnable() {
        public void run() {
            // place your benchmark code here
        }
    });
es.shutdown();
es.awaitTermination(60, TimeUnit.SECONDS);
long time = System.nanoTime() - start;

System.out.printf("%nThe benchmark is complete at " + new Date() + "%nThe benchmark was run in %.3f seconds.%n", time / 1e9);
}

Я предполагаю, что ваша ошибка compile в том, что вы не обрабатываете InterruptedException.Нет необходимости перехватывать InterruptedException, так как: а) это не должно происходить; б) вы ничего не можете сделать, кроме как записать его в журнал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...