0

リンクのリストを反復処理するクラスがあります。リンクごとに、処理を行いたいと思います。そのため、リンクごとにスレッドを作成する必要があります。

コードは次のとおりです(メイン):

ThreadProcessing  tp;
for(int i = 0; i < listUrl.size(); i++)
{
    tp.add(string_url);
}

ThreadProcessing クラスでは、Executor インターフェイスを使用する必要があります。要点: 30 スレッドのプールを作成する必要があります。ThreadP クラスには、非ブロッキング スレッドのリストが含まれます (もちろん、30 を超えるスレッドを含めることができます)。必要な数のスレッドを追加でき、クラスはこれらすべてのスレッドを実行する責任があります。

それが私がやろうとしたことです(うまくいきません)。ThreadProcessingクラス:

public class ThreadProcessing {
    List<Runnable> runnables = new ArrayList<Runnable>();
    ExecutorService pool;

    @PostConstruct
    public void init()
    {
        pool = Executors.newFixedThreadPool(30);
    }

    public void add(String url)
    {   
        runnables.add(createRunnable(url));
        executeRunnables(pool, runnables);
    }

    public static void executeRunnables(final ExecutorService service, List<Runnable> runnables){
        for(Runnable r : runnables){
            service.execute(r);
        }
        service.shutdown();
    }

    private Runnable createRunnable(final String url){

        Runnable getContentFromURL = new Runnable(){
            public void run(){
                //My treatment with url
            }
        };
        return getContentFromURL;
    }
}

説明が漠然としすぎていないことを願っています。ありがとうございます。

4

2 に答える 2

0
public void add( String url) {
    Runnable job = createRunnable(url); 
    runnables.add( job);
    pool.execute( job);
}

また、ジョブの送信/追加が終了しない限り、プールをシャットダウンしないでください。もちろん、この例では、実行可能リストは実際には必要ありません。

于 2013-03-12T10:49:26.757 に答える
0

次のようなものを試してください:

public void main() {
    ExecutorService es = Executors.newFixedThreadPool(30);

    BlockingQueue<String> urls = 
        new ArrayBlockingQueue<String>(listUrl.size(), false, listUrl);
    LinkedList<Future<?>> futures = new LinkedList<Future<?>>();
    for(int i = 0 ; i < 30 ; ++i) {
        futures.add(es.submit(new URLRunnable(urls)));
    }

    // Wait for all the futures to return
    for(Future<?> f : futures) {
        f.get();
    }
}

public class URLRunnable() implements Runnable() {
    private final BlockingQueue<String> urls;
    URLRunnable(BlockingQueue<String> urls) { this.urls = urls; }

    @Override
    public void run() {
        String url = null;
        while((url = urls.poll()) != null) {
            // do something with url
        }
    }
}
于 2013-03-12T10:55:05.687 に答える