1

这是我的第一篇文章,所以如果需要,请让我知道是否有任何我应该添加到帖子中的内容。

我有一个程序,它从我的 MySQL 数据库中获取 url,并将它们发送到一个类,该类会将图像下载到我的桌​​面。

我需要获取 80,000 张图像,而且我想利用多线程来加快速度。

我已经到了某个地方,但现在我被困住了,因为我是多线程的新手,所以我花了几个小时研究。

问题是当程序运行时,它会一遍又一遍地处理前 5 个条目。这恰好是 ExecutorFixedPoolSize。

有人能帮助我吗。

我的代码如下。

    public static void main(String[] args) {

        try{

            countAllAltPicsNotSaved();
            System.out.println("Not saved: " + totalAltPicsNotSaved);

            Class.forName("com.mysql.jdbc.Driver");
            Connection conn =DriverManager.getConnection(dbUrl + dbName, userName, password);
            Statement s = conn.createStatement ();
            s.executeQuery ("SELECT DISTINCT id from productsaltimages WHERE saved != 1");
            ResultSet rs = s.getResultSet();
            int saveCounter = 0, altImageCount = 0;

            List<Thread> threads = new ArrayList<Thread>();



            while (rs.next()) { //Get ID
                altImageCount = 0; //Product Alt Image Counter
                String id = rs.getString("id");  //Product Table ID

                Statement news = conn.createStatement (); //New Conn for get Alt Images From ID
                news.executeQuery ("SELECT url from productsaltimages WHERE id ='"+id+"' AND saved != 5"); //Gets query from mySQL

                ResultSet newrs = news.getResultSet(); //Resultset for AltImges for ID

                ExecutorService executor = Executors.newFixedThreadPool(5);
                Runnable task = null;

                while (newrs.next()){ //Get Images
                    altImageCount++; //Increment ID Alt Image Counter
                    String url = newrs.getString("url");
                    task = new DownloadImage(url, id, altImageCount);
                    executor.execute(task); 

                }
            }

        } catch (Exception e){
        }

    }

    public static void countAllAltPicsNotSaved() throws Exception {
        try{
            totalAltPicsNotSaved=0;
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn =DriverManager.getConnection(dbUrl + dbName, userName, password);
            Statement s = conn.createStatement ();
            boolean sqlExecuteok = false;
            s.executeQuery ("SELECT * from productsaltimages WHERE saved = '0'");
            ResultSet rs = s.getResultSet ();
            while (rs.next()) {
                totalAltPicsNotSaved++;
            }
            rs.close();
            s.close();
            conn.close();
        } catch (Exception e){
        }
    }


For my DownloadImage class code is: 

    public class DownloadImage implements Runnable
{
   String url, id, threadName;
   private int altImageCount = 0;
   private static String userName = "owner"; 
    private static String password = "hello123";
    private static String dbUrl = "jdbc:mysql://localhost/";
    private static String dbName = "shop"; 
    private static String dbClass = "com.mysql.jdbc.Driver";

   public DownloadImage(String url, String id, int altImageCount)
   {
      this.url = url;
      this.id = id;
      this.altImageCount = altImageCount;
   }
   public void run()
   {
      while(true)
      {

        File file=new File("D:\\FBShop_AltImages\\" + id + "\\");
        boolean exists = file.exists();
        if (!exists) {  
            // Create multiple directories
            boolean success = (new File("D:\\FBShop_AltImages\\" + id + "\\")).mkdirs();
        }

        String newFilename = "D:\\FBShop_AltImages\\" + id + "\\" + id + "_" + altImageCount + ".jpg";

        try {

            try {
                BufferedImage image = null;
                URL imgurl = new URL(url);
                URLConnection con = imgurl.openConnection();
                con.setConnectTimeout(50 * 10000);
                con.setReadTimeout(50 * 10000);
                InputStream in = con.getInputStream();
                image = ImageIO.read(in);
                ImageIO.write(image, "jpg", new File(newFilename));

            } catch (Exception e) {
                System.out.println("Error getting image: " + url);
            }  

            try {
                //UpdateTable
                Class.forName("com.mysql.jdbc.Driver");
                String updatesql = "UPDATE productsaltimages SET saved = '1' WHERE id = '"+id+"'";

                Connection conn =DriverManager.getConnection(dbUrl + dbName, userName, password);
                Statement ups = conn.createStatement ();
                int val = ups.executeUpdate(updatesql);
                System.out.println("Task Complete: " + url);
                try {
                    Thread.sleep(5000);
                } catch (Exception e) {
                }
            } catch (Exception e) {
            }
        } catch (Exception e) {
        }
         //System.out.println("Thread Finished: " + threadName);
      }
   }
}
4

1 回答 1

2
 while(true){
    //lots of code inside you Runnable

    Thread.sleep(5000);
    //After the Thread will sleep it will restart it's work again, and again..
 }

这什么时候结束?删除while true,你应该很好。

于 2012-08-13T16:16:17.390 回答