3

我是并发编程的新手,并且一直在处理具有要处理的项目队列的代码,这被传递给一些工作线程,由用户指定的数量。目前我只是尝试用两个工作线程加上主线程来完成它。

private static class workerThread extends Thread {

        workerThread(){
            super();
        }


        public void run(){
             while (!workQueue.isEmpty()) {

            String x = workQueue.remove();
            //System.out.println("work queue size: " + workQueue.size());
            Vector<String> list2 = new Vector<String>((Vector) table.get(x));
            list2 = process(x, list2);
            //System.out.println(list2 + "list2");
            table.put(x, list2);

            //System.out.println(x + "key" + "value" + vvv);

        }

        }

那是线程工作线程类,我试图通过创建两个新线程来调用它:

workerThread wt = new workerThread();
    workerThread wt2 = new workerThread();
    wt.start();
    wt2.start();
    try {
        wt.join();
        wt2.join();
    } catch (InterruptedException ex) {
        Logger.getLogger(includeCrawler.class.getName()).log(Level.SEVERE, null, ex);
    }

我不确定这是否正确,或者由于等待加入而有什么好处?谢谢你的帮助。

4

3 回答 3

2

一种更简洁且可扩展的方法是使用由Executors类创建的线程池。

顺便说一句,该Vector课程已过时,不应再使用-ArrayList改为使用并转储您学会使用Vector的任何书籍或教程-已经过时十多年了。

于 2011-11-24T23:49:34.480 回答
1

只是一些参考资料,我认为您想将 aBlockingQueue与 anExecutorService和 a一起使用Runnableor Callable

final ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());甚至可能是一个实例变量(私有静态最终 ExecutorService POOL = ...)。对于 I/O 绑定应用程序,您可能希望使用比可用处理器更多的线程。然后你又不想使用Vector. 使用另一种List实现(通常ArrayList是要使用的)。

顺便说一句:如果您想掌握并发编程,您可能还想了解 Akka 和 Actors/STM,而不是使用通常的共享可变性模型。

编辑:我肯定会推荐http://pragprog.com/book/vspcon/programming-concurrency-on-the-jvm和来自 Josh(ua) Bloch 的 Effective Java。

于 2011-11-24T23:55:36.907 回答
1

你肯定必须使用执行器。这是一个示例,仅供参考。它适用于单个线程,但我认为这对您来说是一个好的开始。它很容易适应任意数量的线程。

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<MyObject> f =
    executor.submit(new Callable<MyObject>() {

      @Override
      public MyObject call() throws Exception {
        MyObject obj = new MyObject();
        // do stuff
        return obj;
      }

    });

MyObject myObject =
    new MyObject();

try {
  myObject = f.get(500, TimeUnit.MILLISECONDS);
}
catch (InterruptedException e) {
  // stuff
}
catch (ExecutionException e) {
  // stuff
}
catch (TimeoutException e) {
  // stuff
}
finally {
  executor.shutdown();
}

在这种情况下,我想在超时前最多等待 500 毫秒,但这是可选的。希望这会有所帮助。

于 2011-11-25T00:08:35.380 回答