我正在尝试同时下载其网址存储在数据库中的网站的 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
但这对我来说真的很困惑。