继承Thread类实现多线程

发布时间 2023-08-25 17:36:12作者: 士多PL

继承Thread类实现多线程

  • Thread类所属的包和实现的接口

image-20230825155848320

  • 继承Thread类实现多线程的具体步骤:先继承Thread类,然后再重写Thread类的run()方法。

  • 以下是一个从网上下载图片的例子:

    1. 先创建一个下载器Picdownloader
    import org.apache.commons.io.FileUtils;
    import java.io.File;
    import java.io.IOException;
    import java.net.URL;
    
    public class Picdowmloader {
        public void dowmLoad(String url,String name){
            try {
                FileUtils.copyURLToFile(new URL(url),new File("name"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    1. 在创建一个线程测试类TestThread

      package threadByThread;
      
      public class TestThread extends Thread {
          private String url;
          private String name;
          public TestThread(String url, String name) {
              this.name = name;
              this.url = url;
          }
          @Override
          public void run() {
              new Picdowmloader().dowmLoad(url, name);
          }
          public static void main(String[] args) {
              TestThread testThread1 = new TestThread("https://images.cnblogs.com/cnblogs_com/blogs/800940/galleries/2338925/t_230825084221_OIP-C.jpg", "1.jpg");
              TestThread testThread2 = new TestThread("https://images.cnblogs.com/cnblogs_com/blogs/800940/galleries/2338925/t_230825084222_1a8d06d86cdd4e7eb5e4548c457e5371.jpeg", "2.jpg");
              TestThread testThread3 = new TestThread("https://images.cnblogs.com/cnblogs_com/blogs/800940/galleries/2338925/t_230825084222_OIP-C%20(1).jpg", "3.jpg");
              testThread1.start();
              testThread2.start();
              testThread3.start();
          }
      }
      
      
      1. 运行结果

      2. 可以看到图片并不是按照顺序下载的,说明我们的进程创建成功。

      3. 犯下的错误

        • 刚开始写测试类时,写成了下面的代码,导致了只是实现了下载图片的功能,并没有体现到多线程,说明对多线程还是不是很熟悉。
      public class TestThread extends Thread {
          @Override
          public void run() {
              new Picdowmloader().dowmLoad("https://images.cnblogs.com/cnblogs_com/blogs/800940/galleries/2338925/t_230825084221_OIP-C.jpg","1.jpg");
              new Picdowmloader().dowmLoad("https://images.cnblogs.com/cnblogs_com/blogs/800940/galleries/2338925/t_230825084222_1a8d06d86cdd4e7eb5e4548c457e5371.jpeg","2.jpg");
              new Picdowmloader().dowmLoad("https://images.cnblogs.com/cnblogs_com/blogs/800940/galleries/2338925/t_230825084222_OIP-C%20(1).jpg","3.jpg");
          }
      
          public static void main(String[] args) {
              TestThread testThread = new TestThread();
              testThread.start();
          }
      }
      
      • 在使用org.apache.commons.io.FileUtils中的FileUtils.copyURLToFile方法时,把url当成是String类型的了,要把String类型的地址转化成URL,需要new URL(String)。

实现Runnable接口实现多线程

  • Thread类所属的包和实现的接口

image-20230825155848320

  • 实现Runnable接口实现多线程的具体步骤:实现接口,实现run方法,然后在new Thread(testThread1).start()开启线程。

  • 以下是一个从网上下载图片的例子:

    1. 先创建一个下载器Picdownloader
    import org.apache.commons.io.FileUtils;
    import java.io.File;
    import java.io.IOException;
    import java.net.URL;
    
    public class Picdowmloader {
        public void dowmLoad(String url,String name){
            try {
                FileUtils.copyURLToFile(new URL(url),new File("name"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    1. 在创建一个线程测试类TestThread

      public class TestThread implements Runnable {
          private String url;
          private String name;
      
          public TestThread(String url, String name) {
              this.name = name;
              this.url = url;
          }
      
          @Override
          public void run() {
              new Picdowmloader().dowmLoad(url, name);
          }
      
          public static void main(String[] args) {
              TestThread testThread1 = new TestThread("https://images.cnblogs.com/cnblogs_com/blogs/800940/galleries/2338925/t_230825084221_OIP-C.jpg", "1.jpg");
              TestThread testThread2 = new TestThread("https://images.cnblogs.com/cnblogs_com/blogs/800940/galleries/2338925/t_230825084222_1a8d06d86cdd4e7eb5e4548c457e5371.jpeg", "2.jpg");
              TestThread testThread3 = new TestThread("https://images.cnblogs.com/cnblogs_com/blogs/800940/galleries/2338925/t_230825084222_OIP-C%20(1).jpg", "3.jpg");
              new Thread(testThread1).start();
              new Thread(testThread2).start();
              new Thread(testThread3).start();
          }
      }
      
      
      1. 运行结果

      2. 可以看到图片并不是按照顺序下载的,说明我们的进程创建成功。