2013-12-19 4 views
2

Существует много прокси-серверов. Я должен определить эти серверы, которые он может использовать, или не может. Способ отправки: POST Запросить каждый прокси, используя несколько потоков. и затем я забираю сервер, который отражает код ответа 200. В любом случае, это не акцент на моем вопросе, я должен очистить эти потоки, потому что я должен обновлять прокси-сервер каждые 30 минут. Потому что среда общественного прокси-сервера очень нестабильна. И я должен запустить эту программу весь день. (Извините за неуклюжий английский)Выход из нитей.

Я использую это:

 for (int i=0; i<30; i++){ 
      Runnable r = new CheckProxy(ip[i], port[i]); 
      new Thread(r).start(); 
     } 
    } 

Существует веб-сайт, который показывает прокси-серверы. Я приношу это и вставляю код выше. CheckProxy класс отправить отправить запрос и сохранить код ответа. В любом случае В заключение, Как я могу выйти из этих потоков?

Я пробовал это. сделанный переменным static boolean isExit, и метод public void stopChecking() { isExit = true; }.

if (!isExit){ 
    for (int i=0; i<30; i++){ 
      Runnable r = new CheckProxy(ip[i], port[i]); 
      new Thread(r).start(); 
     } 
    } 
    else { Thread.interrupted(); } 
} 

Что я буду делать, просто оставь это. Я хочу закрыть все потоки, которые разрешает проверка. Для этого я вызвал stopChecking(); однако все нити живы. Что мне делать?

+1

Вы, вероятно, нужно сделать ' isExit' быть 'volatile', поскольку он разделяется между потоками. Кроме того, вы должны использовать использование «ExecutorService» вместо того, чтобы разворачивать свои потоки вручную. – Gray

+0

ха? Thread.interrupted ничего не делает, проверяет статус. Вы действительно должны прервать экземпляры. –

+0

@GregGiacovelli Итак, как я могу получить доступ, например? r.interrupted(); или Thread (r) .interrupted? не может ... Я не знаю, как получить доступ к экземпляру ... – Juntae

ответ

1

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

java.util.List<Thread> al = new java.util.ArrayList<Thread>(); 
for (int i=0; i<30; i++){ 
    Runnable r = new CheckProxy(ip[i], port[i]); 
    Thread t = new Thread(r); 
    al.add(t); 
    t.start(); 
} 
// Ensure all of the threads finish before continuing. 
for (Thread t : al) { 
    t.join(); // or t.interrupt(); 
} 
+0

Спасибо ... Ты гений ... Он работает ... – Juntae

1

Или использовать стандартный ExecutorService подход:

ExecutorService service = Executors.newFixedThreadPool(30); 

for (int i=0; i<30; i++){ 
    service.submit(new CheckProxy(ip[i], port[i])); 
} 

service.shutdown(); 
service.awaitTermination(10, TimeUnit.SECONDS); 
+1

+1 Спасибо. Я вижу это после принятия другого вопроса. Это тоже очень полезно. имейте приятные chirstmas! – Juntae

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