【发布时间】:2015-09-12 16:13:29
【问题描述】:
我正在尝试同时下载其网址存储在数据库中的网站的 HTML 代码(大约 300 万个条目)。
很明显,我应该使用多线程技术,但我遇到了如何在 java 中做到这一点的麻烦。
以下是我过去在不使用多线程的情况下的做法:
final Connection c = dbConnect(); // register jdbc-driver and establish connection
checkRequiredDbAndTables(); // here we check the existence of the Db and necessary tables
try {
// now get list of urls from the db
String sql = "select id, website_url, category_id from list_of_websites";
PreparedStatement ps = c.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
// column numeration in ResultSet is from 1 !
final long id = rs.getInt(1); // get website id
final String url = rs.getString(2); // get website url
System.out.println("Category: " + rs.getString(3) + " " + id + " " + url);
if ( isValidURL(url) && connectionOK(url) ) {
// checked url syntax and connection
String htmlInPage = downloadHTML(url);
if (!htmlInPage.equals("")) {
// add result to db
insertDataToDb( c, id, htmlInPage);
}
}
}
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
closeConnection(c); // database connection closed
函数donloadHTML使用JSoup库做主要工作。
感觉我的任务是一种“生产者消费者问题”。我想它可以用这样的方式表示:有一个缓冲区,包含 N 个链接;一些进程从中获取链接并下载 HTML;和一个过程,其目的是在缓冲区变空时将新的 url 从 db 加载到缓冲区中。
但我完全不知道该怎么做。我听说过Threads 和ExecutorService 提供ThreadPools,但这对我来说真的很困惑。
【问题讨论】:
-
为什么很明显你应该对 IO 绑定的东西使用多线程?
-
1.您提供的代码与问题完全无关。 2. 代码使用我们无法发表意见的方法
-
您已经“听说”过 Threads 并且它们让您感到困惑?您是否尝试过阅读以了解更多信息?例如这里:docs.oracle.com/javase/tutorial/essential/concurrency/…
-
@Jeff 能够从 fastwebsite.com 下载 200 个页面,而另一个线程被阻止等待 slowwebsite.com 响应。
-
@JacekCz ,1)我提供了我现在拥有的代码,并希望以多线程方式更改它,但不知道如何 2)假设此方法正常工作。
protected Connection dbConnect() { String url = host + db; Class.forName(driver); // Register JDBC driver Connection c = DriverManager.getConnection(url, user, password); // Open a connection return c; }当然要处理异常
标签: java multithreading concurrency java-threads