2010-07-05 2 views
2

У меня есть класс, который начинает новый поток, вызвавИдущие более 2 нити внутри 1 класса

public void omnom(){ 
    t = new Thread(this, "My Thread"); 
    t.start(); 
} 

Новый поток затем проходит внутри метода run(). Итак, у меня есть два потока, которые отлично работают, но как добавить третий? Я хотел бы «разделить» на 2 потока, например t.start(); + f.start();, как бы я отделил их оба от omnom() и выслал их на 2 разных метода «run()»?

Спасибо!

+0

Эйдана, не могли бы вы уточнить, что вы имеете в виду через «2 разных метода' run() »? Я заметил, что Божо опубликовал более простой ответ, чем мой, но позже удалил его. Его ответ может быть правильным, в зависимости от того, как вы имели в виду вашу формулировку. –

ответ

4

Вы можете создать анонимный Runnable класс назвать то, что «запустить» метод, который вы предпочитаете:

public void omnom() { 
    new Thread(this, "My Thread").start(); 
    new Thread(
      new Runnable() { 
       public void run() { 
        otherRunMethod(); 
       } 
      } 
     ).start(); 
} 
0

Просто повторяя new Thread() и start().

Вы должны различать структуру времени компиляции и структуру времени выполнения. Вы можете иметь столько потоков, используя тот же самый байт-код класса, сколько хотите, и они будут счастливо выполнять любую часть класса для своего частного потока выполнения, даже если это ту же строку кода, которая в настоящее время выполняется другим потоком!

(В самом деле, то есть вся причина, почему параллельное программирование настолько сложна, и поэтому синхронизация еще нужно: потому что байт-код не принадлежит конкретному потоку, но с помощью загрузчика классов.)

1

Когда вы создаете поток, вы передаете экземпляр Runnable в качестве первого параметра - и его метод run() этого runnable, вызываемый потоком.

Так что в вашем конкретном случае вы проходите в this - предположительно, класс, который вы вызываете, реализует Runnable и имеет метод run(), поэтому этот метод вызывается потоком t. Для того, чтобы иметь другую нить f вызов другой метод, вам просто нужно передать другой экземпляр Runnable в конструктор потока, который имеет различные run() метод, что-то вроде этого:

public void omnom(){ 
    Thread t = new Thread(this, "My Thread"); 
    t.start(); 

    // Get this Runnable from somewhere, possibly pass it in as a method 
    // parameter/construct it explicitly here/whatever 
    Runnable fRunner = ...; 
    Thread f = new Thread(fRunner, "My Other Thread"); 
    f.start(); 
} 
Смежные вопросы