2011-07-21 2 views
3

Я пытаюсь понять, как многопоточность в java. Прямо сейчас моя программа отлично работает без параллелизма, но я хочу реализовать многопоточность, чтобы ускорить ее.Многопоточная Java

Программа запускает несколько объектов отдельного подкласса и 50% оценки времени для каждого из этих объектов проводится в процессе, который использует только одно ядро, а не 8 доступных. Эти объекты полностью независимы друг от друга до тех пор, пока они не будут использоваться в качестве входных данных в программе.

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

Однако, как работают потоки в java handeled? Должен ли я избавиться от потоков после каждого прогона? Как работает объединение?

спасибо

+2

Если вы пишете серьезное приложение, вы должны реально смотреть в теорию: http://download.oracle.com/javase/tutorial/essential/concurrency/. В противном случае вы научитесь этому трудно :-) – home

ответ

5

Вы в значительной степени находитесь на пути. Вы создаете объект Thread

Runnable r = new MyClassImplementingRunnable(); 
Thread t = new Thread(p); 
t.start(); 
t.join(); // wait for thread to die 

объект Thread является сбор мусора, как и любой другой объект, сама нить умирает, когда метод запуска завершается. Главное, что ваш метод Runnable должен гарантировать возврат, ваш дизайн не может зависеть от возможности убить поток извне.

Если у вас будет много потоков, вам нужно дождаться их завершения, чтобы вы могли сохранить коллекцию потоков, которые вы начали, а затем использовать t.join (smallNumberOfMillis), чтобы увидеть, какой из они закончили. Это немного неэффективно, поэтому есть другие методы, позволяющие потокам общаться друг с другом, я предлагаю прочитать о них this article.

@denis также упоминает, что Исполнитель и связанные с ним классы обеспечивают лучшую абстракцию над Threads. Если у вас есть интерес к изучению фона, то ручное управление Threads интересно. Если вы просто хотите выполнить свою работу, следуйте предложению Дениса.

+0

не comme il faut для управления потоками вручную :) –

+0

ну да, это случай, если он сначала изучит основные сведения или использует более привлекательную абстракцию. – djna

+0

Как настроить метод запуска в подклассе? Прямо сейчас я получаю ошибку исключения nullpointer, вызванную – randomafk

7

Не управлять потоками вручную, посмотрите на executors and thread pools в Java

+0

Я буду изучать его позже, но сначала хочу получить представление об основах hte – randomafk

+1

@randomafk: Эти * - это основы. –

3

Взгляните на http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html

Конструктор принимает число потоков, которые вы хотите. В этом случае то же самое, что и количество ядер.

ScheduledThreadPoolExecutor s = new ScheduledThreadPoolExecutor(8); 
List<Future> futures = new ArrayList<Future>(); 
foreach(...something...) 
    futures.add(s.submit(new MyCallable())); 
foreach(Future f : futures) 
    f.get(); // Result of computation 
System.out.println("Done"); 
+0

класс MyCallable должен иметь специальную функцию запуска, например, с Runnable? – randomafk

+0

Да Callable - как Runnable, за исключением определенных как интерфейс Callable {V call(); }, чтобы они могли возвращать объект вашего предпочтительного типа. http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/Callable.html –

0

Это хороший способ начать многопоточность.

public class ThreadExample { 
    public static void main(String[] args) { 
     //Main thread 
     System.out.println("Main thread"); 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       //This thread is independent of the main thread 
       System.out.println("Inner Thread"); 
      } 
     }).start(); 
    } 
} 
Смежные вопросы