Как передать метод с аргументами в Callable - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь реализовать многопоточность с помощью Callable / Future в моем Raytracer, разделяя процесс по каждой строке / столбцу.Для этого мне нужно передать переменные из моего Main в Callable, который не принимает аргументы.

Я попытался передать всю функцию как вызываемую

Это функция, которую я пытаюсь использовать в многопоточном режиме,'formen' - моя группа объектов, которые я передаю.Отправка лучей и нахождение пересечений - это то, что требует наибольшей вычислительной мощности -

    static Image raytrace(Camera camera, Group formen, int samples){
        Image image = new Image(camera.width, camera.height);

        for (int x = 0; x != camera.width; x++) {
            for (int y = 0; y != camera.height; y++) {

                Vec3 color = new Vec3(0, 0, 0);
                for (int xi = 0; xi < samples; xi++) {
                    for (int yi = 0; yi < samples; yi++) {
                        double rx = random.nextDouble();
                        double ry = random.nextDouble();
                        double xs = x + (xi + rx) / samples;
                        double ys = y + (yi + ry) / samples;

                        Ray ray = camera.sendRay(xs,ys);
                        Hit hit = formen.intersect(ray);
                        if(hit != null) color = Vec3.add(color, calculateRadiance(formen, ray, 100));
                    }
                }
                color = Vec3.divide(color, Math.pow(samples, 2));
                image.setPixel(x, y, color);
            }
        }
        return image;
    }

Вот как выглядит моя функция трассировки:

        int cores = Runtime.getRuntime().availableProcessors();
        Thread[] threads = new Thread[cores];
        Image[] images = new Image[cores];
        // Pool creation
        ExecutorService pool = Executors.newFixedThreadPool(4);
        //images[core] = raytrace(camera, scene, nn);
        for(int i = 0; i < camera.height; i++){
            Future<Image> pixel = pool.submit(calculateOneRow);
            //threads[i].start();
            System.out.println("Thread started:");
            pool.shutdown();
            try {
                System.out.println("Image written");
                return pixel.get();
                //Image color = pixel.get();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
            final long duration = (System.nanoTime() - startTime) / 1000000;
            return image;
        }

Думаю, внутренний цикл for должен войти в моюМожет быть вызван, но я не знаю, как передать их каждому как отдельную задачу.Моя цель - уменьшить время рендеринга.

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