Методы многопоточного класса Java? - PullRequest
2 голосов
/ 10 декабря 2011

Я новичок в многопоточности в Java, и я хотел бы знать, возможно ли параллельно выполнять метод в классе .Поэтому вместо этого:

public void main() {
  this.myMethod();
  this.myMethod();
}

... где каждый метод в классе запускается после завершения предыдущего вызова, что они будут выполняться параллельно.Я знаю, что следующий пример можно сделать, но он включает в себя создание новых классов, которых я хотел бы избежать:

public class HelloRunnable implements Runnable {
  public void run() {
    System.out.println("Hello from a thread!");
  }

  public static void main(String args[]) {
    (new Thread(new HelloRunnable())).start();
  }
}

Просто чтобы прояснить ситуацию, я видел этот пример , ноэто не помогло мне.

Ключ к решению этой проблемы связан с использованием public static методов?В любом случае, не могли бы вы привести пример, как это сделать с помощью своего решения?

Спасибо за потраченное время!

Ответы [ 2 ]

4 голосов
/ 10 декабря 2011

Извините, не может быть сделано в соответствии с вашими ограничениями. Вы не можете запустить что-либо в потоке Java без создания объекта Thread и объекта, содержащего метод run(): либо отдельный класс, который реализует Runnable, либо класс, который расширяет Thread. Вопрос, на который вы указали, показывает, что именно нужно делать; нет лучшего ответа, да и нет любой другой ответ.

2 голосов
/ 10 декабря 2011

Я бы, наверное, сделал это так.Классы CountDownLatch и Executors - это удобные утилиты из Java 5, облегчающие подобные вещи.В этом конкретном примере CountDownLatch будет блокировать main () до тех пор, пока не завершатся оба параллельных выполнения.

(Итак, чтобы ответить на ваш вопрос: это даже хуже, чем вы думали! Вы должны написать даже БОЛЬШЕ кода!)

ExecutorService EXECUTOR_SERVICE = Executors.newCachedThreadPool();

public void main() {
  final CountDownLatch cdl = new CountDownLatch(2); // 2 countdowns!
  Runnable r = new Runnable() { public void run() {
    myMethod();
    cdl.countDown();
  } };

  EXECUTOR_SERVICE.execute(r);
  EXECUTOR_SERVICE.execute(r);

  try {
    cdl.await();
  } catch (InterruptedException ie) {
    Thread.currentThread().interrupt();
  }
}
...