Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > В каком потоке будет исполняеться метод


Автор: kaa 30.7.2009, 13:18
Есть такой вопрос:
 - я создаю класс имплементирующий Runnable интерфейс с бесконечным циклом в методе run() и какими-то другими методами, принадлежащими классу;
 - я дергаю какой-либо метод у данного класса: в каком потоке будет исполняться этот метод? В потоке класса-хозяина или в том потоке, откуда его дёрнули?

Всю голову сломал, но вот переклинило меня и всё smile С потоками только пытаюсь начать работать smile

Автор: Platon 30.7.2009, 14:09
Не теми терминами мыслите, товарищ. У классов нет потоков. Поток - это беговая дорожка, в которой вас перебрасывает от операции к операции, классы лишь показывают адреса полей и методов в памяти. Т.е. следите какой поток зашел в функцию, в нем же и будет вызвана следующая функция.
Не забываем о хитрых случаях, когда можно напороться на ExecutorService и там уже задача будет передана другим потокам, а наш поток не дожидаясь исполнения задачи продолжит свой бег.

Автор: kaa 30.7.2009, 14:45
Нет, я понимаю что классы это не потоки. смвой оборот я применил что бы выделить "мой" поток, который я сам реализую smile

Тоесть, как я понял, функция, вызванная из класса, из любого, даже реализующего Runnable интерфейс, будет выполняться в вызвавшем её потоке, так?

А что такое ExecutorService? Это я как понимаю и есть способ отдать выполнение задачи другому потоку? 
Если да, то в какую сторону гуглить?
Можно об этом чуточку поподробнее?

Спасибо!

Автор: Platon 30.7.2009, 16:08
Цитата(kaa @  30.7.2009,  15:45 Найти цитируемый пост)
Тоесть, как я понял, функция, вызванная из класса, из любого, даже реализующего Runnable интерфейс, будет выполняться в вызвавшем её потоке, так?

Разумеется smile То, что класс реализует интерфейс Runnable, чести ему не прибавляет.

Цитата(kaa @  30.7.2009,  15:45 Найти цитируемый пост)
А что такое ExecutorService? Это я как понимаю и есть способ отдать выполнение задачи другому потоку? 

Да, это интерфейс из библиотеки для многопоточной работы java.util.concurrent 

Там даже пример есть.

Код

class NetworkService implements Runnable {
   private final ServerSocket serverSocket;
   private final ExecutorService pool;

   public NetworkService(int port, int poolSize)
       throws IOException {
     serverSocket = new ServerSocket(port);
     pool = Executors.newFixedThreadPool(poolSize);
   }

   public void run() { // run the service
     try {
       for (;;) {
         pool.execute(new Handler(serverSocket.accept()));
       }
     } catch (IOException ex) {
       pool.shutdown();
     }
   }
 }

 class Handler implements Runnable {
   private final Socket socket;
   Handler(Socket socket) { this.socket = socket; }
   public void run() {
     // read and service request on socket
   }
 }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)