Многопоточность с циклами for в Java

1

Хорошо, поэтому я пытался запустить цикл for, который работает 60 раз. В этом цикле for я использую Thread.sleep(2000); для ping сервера. Я хочу сделать это 10 раз для этого потока, но для отдельного цикла через цикл for. В то же время я хочу, чтобы еще 6 потоков выполняли 10 собственных действий, поэтому этот процесс дыр ускоряется и завершается примерно через 12 секунд.

for(int i = 0; i < 6; i++) {
    //I am starting a new thread here. 
}

@Override
public void run() {
//THIS is where i want a each thread to be doing 10 each to speed up the process.
  for(int i = 0; i < 60; i++) {
    //Pinging server.
    Thread.sleep(2000L);
    //Gets info from server here. That is why there is a 2 second delay.
  }
}

Прошу прощения, если это трудно понять, но я попытался установить это самым простым способом.

Заранее спасибо.

  • 0
    Какой у Вас вопрос?
  • 0
    ты хочешь пинговать и получать ответ 10 раз за каждый проход цикла for? Это означает, что у вас будет 600 пингов для каждого потока, а для 6 - всего 3600 пингов.
Показать ещё 1 комментарий
Теги:
multithreading

2 ответа

1
Лучший ответ

Если я получу вас правильно, вы не будете зависеть от результатов, верно? Вот быстрая рукопись, сделанная из кода:

Thread[] t = new Thread[6];
for(int i = 0; i < 6; i++) {
   t[i] = new Thread() {
     @Override
     public void run() {
        for(int i = 0; i < 60; i++) {
          //Pinging server.
          Thread.sleep(2000L);
          //Gets info from server here. That is why there is a 2 second delay.
        }
       }
     };
     t[i].start();
}

Thread.sleep(longEnough);

Это самый дешевый вариант для запуска потоков, но будьте осторожны, это не профессионально! Вы должны, по крайней мере, перебрать массив потоков, чтобы вызвать join() на них, чтобы ждать достаточно долго, вместо использования постоянной времени.

Если вы хотите выполнять серьезные потоки, рассмотрите возможность использования Java ExecutorService (см. Http://www.vogella.com/tutorials/JavaConcurrency/article.html#threadpools) или ForkJoin из Java 7 (http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html)

  • 0
    Спасибо за дополнительные источники, которые вы связали, это должно очень помочь :)
1

В исходном цикле for вместо создания потоков вы должны создавать экземпляры Callable. Добавьте их в список, создайте Исполнителя и передайте список Исполнителю (например, FixedThreadPool). Затем выполните Executor, и они будут работать параллельно. После всех этих намеков, я оставляю вам реализацию, так как это выглядит красноречиво, как вопрос домашней работы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню