Как гарантировать потокобезопасность для переопределенных методов? - PullRequest
1 голос
/ 16 августа 2010

Я боролся с этим уже 7 дней.Ваши идеи будут высоко оценены.

Рассмотрим код фреймворка.

final class Main {
 // assuming programmerCode was injected
 Interface inter = (Interface) programmerCode;
 inter.doProcess();
}

interface Interface {
 void doProcess();
}

abstract ProgramApp implements Interface {
 public void doProcess() { 
  for (File file : files) {
   foo(file);
   bar(file);
  }
 }

 public abstract void foo(File file);
 public abstract void bar(File file);
}

abstract Program extends ProgramApp {
 public final void doProcess() { }
}

и код, использующий его,

class ProgrammerCode extends Program {

 File file;
 String a1;
 String a2;

 public void foo(File file) {
  // read file per line store in a1
 }

 public void bar(File file) {
  // read file per line and append somestring and store in a2 
 }
}

Сейчас эта программа обрабатывает файлы всерии.Любое предложение о том, как заставить эту программу обрабатывать файлы параллельно, не касаясь ProgrammerCode?

Цель: Каждый файл должен обрабатываться независимо параллельно, используя реализацию методов в ProgrammerCode, не изменяя его.Модификация должна быть сделана где-то в коде фреймворка.

Я действительно понятия не имею, где разместить потоковую часть здесь.Я предполагаю, что это должно быть в файловом цикле, но я не знаю, является ли он потокобезопасным, поскольку я буду использовать методы, определенные в ProgrammerCode.

Ответы [ 4 ]

1 голос
/ 22 августа 2010

Мое предложение сделало бы обработку файлов полностью независимой. Это полностью устраняет проблему многопоточности и позволяет расширять / реализовывать интерфейс, не заботясь о параллелизме. Вы можете использовать ThreadPoolExecutor из java.util.concurrent для параллельного выполнения файловых задач.

Псевдокод будет выглядеть так:

main () {

Файловые файлы; Пул ThreadPoolExecutor;

для (Файл файл: файлы) { pool.execute (new Runnable () { бежать() { Интерфейс inter = (Интерфейс) programmerCode; inter.doProcess (файл); } }); }

1 голос
/ 16 августа 2010

Независимо от того, что вы делаете, разработчик ProgrammerCode может писать плохой код в целом и потокобезопасный код в частности.Лучшее, что вы можете сделать, - это попытаться упростить правила, которым должен следовать разработчик.

Следовательно, предложение Джона о простом правиле, один ProgrammerCode на файл, имеет большой смысл.Затем разработчику сообщается, что у него есть один экземпляр ProgrammerCocde для каждого файла и что он отвечает за любое взаимодействие между экземплярами.

1 голос
/ 16 августа 2010

Один из вариантов - ввести ProgrammerCode провайдера вместо действительного ProgrammerCode.Затем вы можете создать один экземпляр для каждого файла и выполнять его параллельно.Каждый экземпляр ProgrammerCode будет использоваться только в одном потоке.

0 голосов
/ 16 августа 2010
abstract ProgramApp implements Interface {
 public void doProcess() { 
  for (File file : files) {
   new Thread(
      new Runnable() {
        public void run() {
             foo(file);
             bar(file);
        }
      }).start();
  }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...