заводная нить для URL - PullRequest
       11

заводная нить для URL

0 голосов
/ 27 апреля 2010

Я написал логику для тестирования URL с использованием потоков. Это хорошо работает при меньшем количестве URL-адресов и при неудачном с проверкой более 400 URL-адресов.

URL-адрес класса расширяет тему {
действительно url def

URL( url ) {
    this.url = url
}

void run() {
    try {
        def connection = url.toURL().openConnection()
    connection.setConnectTimeout(10000)
        if(connection.responseCode == 200 ){
            valid = Boolean.TRUE
        }else{
            valid = Boolean.FALSE
        }
    } catch ( Exception e ) {
        valid = Boolean.FALSE
    }
}
}



    def threads = [];
    urls.each { ur ->
       def reader = new URL(ur)
       reader.start()
       threads.add(reader);
    }

     while (threads.size() > 0) {
       for(int i =0; i < threads.size();i++) {
         def tr = threads.get(i);
            if (!tr.isAlive()) {
                if(tr.valid == true){
                  threads.remove(i);
                  i--; 
            }else{
              threads.remove(i);
              i--;
            }
        }
     }

Может ли кто-нибудь сказать мне, как оптимизировать логику и где я ошибался.

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

Ответы [ 2 ]

2 голосов
/ 28 апреля 2010

Рассматривали ли вы использование помощников java.util.concurrent? Это позволяет многопоточное программирование на более высоком уровне абстракции. Существует простой интерфейс для запуска параллельных задач в пуле потоков, который проще в управлении и настройке, чем просто создание n потоков для n задач и надежда на лучшее.

Ваш код в конечном итоге будет выглядеть примерно так, где вы можете настраивать nThreads, пока не получите наилучшую производительность:

import java.util.concurrent.*

def nThreads = 1000
def pool = Executors.newFixedThreadPool(nThreads)
urls.each { url ->
    pool.submit(url)
}
def timeout = 60
pool.awaitTermination(timeout, TimeUnit.SECONDS)
1 голос
/ 29 апреля 2010

Используя предложение атайлора и ваш код, я получил следующее:

import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit

class MyURL implements Runnable {
  def valid
  def url

  void run() {
    try {
      url.toURL().openConnection().with {
        connectTimeout = 10000
        if( responseCode == 200  ) {
          valid = true
        }
        else {
          valid = false
        }
        disconnect()
      }
    }
    catch( e ) {
      valid = false
    }
  }
}

// A list of URLs to check
def urls = [ 'http://www.google.com',
             '/1591043/zavodnaya-nit-dlya-url',
             'http://www.nonexistanturlfortesting.co.ch/whatever' ]

// How many threads to kick off
def nThreads = 3
def pool = Executors.newFixedThreadPool( nThreads )

// Construct a list of the URL objects we're running, submitted to the pool
def results = urls.inject( [] ) { list, url ->
  def u = new MyURL( url:url )
  pool.submit u
  list << u
}

// Wait for the poolclose when all threads are completed
def timeout = 10
pool.shutdown()
pool.awaitTermination( timeout, TimeUnit.SECONDS )

// Print our results
results.each {
  println "$it.url : $it.valid"
}

Что печатает это:

http://www.google.com : true
/1591043/zavodnaya-nit-dlya-url : true
http://www.nonexistanturlfortesting.co.ch/whatever : false

Я изменил имя класса на MyURL, а не URL, как у вас, так как это скорее всего позволит избежать проблем, когда вы начнете использовать класс java.net.URL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...