2013-04-01 2 views
0

Предположим, у меня есть класс, который реализует интерфейс Runnable, и я должен сделать 5 экземпляров данного класса в основной программе. Я хотел бы сохранить их либо в массиве, либо в коллекции. Поскольку класс реализует Runnable, я понимаю, что единственный способ сохранить его - в контейнере потоков, таком как Thread[]. Однако, если я это сделаю, я не могу использовать переопределенные классы toString(), например, или любой другой пользовательский метод/поле.Сохранение нескольких потоков в Java

public class LittleClass implements Runnable{ 
    public void run(){ 

    } 
} 

public static void main(String[] args){ 
    Thread[] smallClasses = new Thread[5]; 

    // initialize and so... 

    smallClasses[i].customField//not accessible 
    System.out.println(smallClasses[i])//gives Thread[Thread-X,X,] 
} 
+1

Почему вы не можете просто сохранить массив 'LittleClass'? – Andrey

+0

Если бы я сделал это, то создание новой темы с потоком t = новая тема (новый LittleClass()) не будет сохраняться в массиве LittleClass [], или я что-то пропустил? :) –

+0

@ Mr.Potson: Нет ничего, что помешало бы вам создать свой массив или коллекцию объектов LittleClass, а затем итерацию через массив, создающий потоки. Но что более важно, вы пропустили ответ Грея. Вам лучше посмотреть на это и на его учебник, поскольку это лучший способ. –

ответ

2

Вы должны рассмотреть возможность использования ExecutorService. Затем вы сохраняете массив своих классов работы и отправляете их в службу, которая будет запущена.

// create a thread pool with as many workers as needed 
ExecutorService threadPool = Executors.newCachedThreadPool(); 
// submit your jobs which should implements Runnable 
for (YourRunnable job : jobs) { 
    threadPool.submit(job); 
} 

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

// shuts the pool down but the submitted jobs still run 
threadPool.shutdown(); 
// wait for all of the jobs to finish 
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); 
// now go back and print out your jobs 
for (YourRunnable job : jobs) { 
    System.out.println(jobs.toString()); 
} 

Адрес good tutorial on the subject.

+0

Но почему это так сложно? – Andrey

+1

@Andrey: потому что этот объект был создан именно для этой ситуации. 1+ –

+0

Поскольку в любое время кто-то имеет массив потоков, они должны использовать 'ExecutorService' @Audrey. Для этого они и есть. – Gray

0

Вы можете создать свой собственный класс, который реализует Runnable, а затем расскажет массив этих пользовательских классов.

Так, например, в коде вы писали выше, вы всегда можете использовать

LittleClass[] objs = new LittleClass[4]; 
for(int i = 0; i < objs.length; i++) { 
    objs[i] = new LittleClass(); 
} 
+0

Как это? Кажется разумным. – CodeGuy

+1

ОК, я сниму свой голос. Но вы понимаете, что нет причин рекомендовать его класс расширить Thread, и многие причины этого не делать. –

+0

Я имел в виду «реализовать Runnable», и я его отредактировал, чтобы это отразить. – CodeGuy

Смежные вопросы