12.11.2012 12:41
0 35 6
Динамичное создание потоков.
Я показывал, как сделать так, чтобы бот работал в многопоточном режиме. Но такое создание потоков очень не удобно. Создание даже 10-ти потоков будет долгим и нудным. А если их создать 100? Или хочется попробовать разное количество и проверить эффективность? Создавать их и удалять? Конечно, нет.
Создаём в классе HWM_PersScanner следующие поля:
Thread[] t;
int[] Start, End;
int TreadCount = 5;
int MaxID = 10000;
int MinID = 1;
Это массив, который будет содержать сами потоки, массив начальных и конечных значений для этих потоков, количество потоков, а так же минимальное и максимальное значение для бота.
Теперь создадим метод ScanAll, который будет заниматься созданием потоков. В нём сначала проинициализируем массивы по указанному числу потоков:
t = new Thread[TreadCount];
Start = new int[TreadCount];
End = new int[TreadCount];
Определяем, сколько персонажей придётся обработать одному потоку:
int step;
float f = (float)MaxID/(float)TreadCount;
if (f > (int)f) step = (int)f + 1;
else step = (int)f;
В цикле инициализируем потоки. Пусть они выполняют метод GetPart(), его созданием займёмся чуть позже. Определяем начальные и конечные значения ID для них и задаём каждому имя - его номер.
for (int i = 0; i < TreadCount; i++){
t = new Thread(new Runnable() {
@Override
public void run() {
GetPart();
}
});
Start = i * step;
End = (i + 1) * step;
t.setName("" + i);
}
Теперь выполняем их:
for (int i = 0; i < TreadCount; i++) t.start();
И ждём их завершения:
for (int i = 0; i < TreadCount; i++) try {
t.join();
} catch (InterruptedException ex) {;}
Метод join может сгенерировать InterruptedException, про него я уже говорил ранее.
Метод GetPart() будет определять имя текущего потока и запускать ScanDiapason:
private void GetPart(){
int N = Integer.parseInt(Thread.currentThread().getName());
ScanDiapason(Start[N], End[N]);
}
Теперь, чтобы работала переменная MinID изменим вызов GetPage в ScanDiapason:
GetPage("http://my.lordswm.com/pl_info.php?id=" + (i + MinID));
Всё. Теперь количество потоков легко изменять, меняя значение переменной TreadCount, а диапазон работы бота переменными MaxID и MinID. Осталось сделать вызов метода ScanAll в main:
HWM_PersScanner scanner = new HWM_PersScanner();
scanner.ScanAll();
Создаём в классе HWM_PersScanner следующие поля:
Thread[] t;
int[] Start, End;
int TreadCount = 5;
int MaxID = 10000;
int MinID = 1;
Это массив, который будет содержать сами потоки, массив начальных и конечных значений для этих потоков, количество потоков, а так же минимальное и максимальное значение для бота.
Теперь создадим метод ScanAll, который будет заниматься созданием потоков. В нём сначала проинициализируем массивы по указанному числу потоков:
t = new Thread[TreadCount];
Start = new int[TreadCount];
End = new int[TreadCount];
Определяем, сколько персонажей придётся обработать одному потоку:
int step;
float f = (float)MaxID/(float)TreadCount;
if (f > (int)f) step = (int)f + 1;
else step = (int)f;
В цикле инициализируем потоки. Пусть они выполняют метод GetPart(), его созданием займёмся чуть позже. Определяем начальные и конечные значения ID для них и задаём каждому имя - его номер.
for (int i = 0; i < TreadCount; i++){
t = new Thread(new Runnable() {
@Override
public void run() {
GetPart();
}
});
Start = i * step;
End = (i + 1) * step;
t.setName("" + i);
}
Теперь выполняем их:
for (int i = 0; i < TreadCount; i++) t.start();
И ждём их завершения:
for (int i = 0; i < TreadCount; i++) try {
t.join();
} catch (InterruptedException ex) {;}
Метод join может сгенерировать InterruptedException, про него я уже говорил ранее.
Метод GetPart() будет определять имя текущего потока и запускать ScanDiapason:
private void GetPart(){
int N = Integer.parseInt(Thread.currentThread().getName());
ScanDiapason(Start[N], End[N]);
}
Теперь, чтобы работала переменная MinID изменим вызов GetPage в ScanDiapason:
GetPage("http://my.lordswm.com/pl_info.php?id=" + (i + MinID));
Всё. Теперь количество потоков легко изменять, меняя значение переменной TreadCount, а диапазон работы бота переменными MaxID и MinID. Осталось сделать вызов метода ScanAll в main:
HWM_PersScanner scanner = new HWM_PersScanner();
scanner.ScanAll();