多线程

1.什么是多线程?

原来是一条路,慢慢因为车太多了,道路堵塞,效率极低。
为了提高使用的频率,能够充分利用道路,于是加了多个车道

2.线程实现三种方式

  1. 继承Thread类

  2. 实现Runnable 接口

  3. 实现Callable 接口

继承Thread类实现多线程步骤如下

  1. 自定义线程类继承Thread类

  2. 重写run() 方法,编写线程执行体

  3. 创建线程对象,调用start() 方法启动线程

  创建线程方式1:继承Thread(通过查看源码发现Thread 是实现Runnable接口的

 public class TestThread1 extends Thread {
      @Override
      public void run() {
          //run方法 线程体
          for (int i = 0; i < 10; i++) {
              System.out.println("我在撸代码--"+i);
          }
      }
  
      public static void main(String[] args) {
          //创建线程对象
          TestThread1 testThread1 = new TestThread1();
          //调用start()方法 ,开启线程
          testThread1.start();
  
          //main线程,主线程
          for (int i = 0; i < 10; i++) {
              System.out.println("我在学习--"+i);
          }
  
      }
  }
  
  //执行结果
  我在学习--0
  我在学习--1
  我在学习--2
  我在学习--3
  我在学习--4
  我在学习--5
  我在学习--6
  我在学习--7
  我在撸代码--0
  我在撸代码--1
  我在学习--8
  我在撸代码--2
  我在撸代码--3
  我在撸代码--4
  我在学习--9
  我在撸代码--5
  我在撸代码--6
  我在撸代码--7
  我在撸代码--8
  我在撸代码--9

 创建线程方式2:实现Runnable接

public class TestThread3 implements Runnable{
      @Override
      public void run() {
          //run方法 线程体
          for (int i = 0; i < 10; i++) {
              System.out.println("我在撸代码--"+i);
          }
      }
      public static void main(String[] args) {
          //创建线程对象
          TestThread3 testThread3 = new TestThread3();
          //创建线程对象,通过线程对象来开启我们的线程
          Thread thread = new Thread(testThread3);
          thread.start();
  
          //main线程,主线程
          for (int i = 0; i < 10; i++) {
              System.out.println("我在学习--"+i);
          }
  
      }
  }
  //输出
  我在学习--0
  我在学习--1
  我在学习--2
  我在学习--3
  我在学习--4
  我在撸代码--0
  我在学习--5
  我在撸代码--1
  我在学习--6
  我在撸代码--2
  我在撸代码--3
  我在学习--7
  我在学习--8
  我在学习--9
  我在撸代码--4
  我在撸代码--5
  我在撸代码--6
  我在撸代码--7
  我在撸代码--8
  我在撸代码--9

创建线程方式3:实现Callable 接口

1.实现Callable接口,需要返回值类型

2.重写call 方法,需要抛出异常   

3.创建目标对象   

4.创建执行服务:   

5.提交执行:   

6.获取结果:   

7.关闭服务:

这边我们需要导入个包commons-io-2.6.jar在com目录下创建lib目录,把上面jar包复制粘贴到里面,右键ADD as Libray

//线程创建方式三
  import org.apache.commons.io.FileUtils;
  import java.io.File;
  import java.io.IOException;
  import java.net.URL;
  import java.util.concurrent.*;
  public class Demo1 implements Callable<Boolean> {
      private String url;//网络图片地址
      private String name;//保存的文件名
  
      public Demo1(String url, String name) {
          this.url = url;
          this.name = name;
      }
      
      @Override
      public Boolean call() throws Exception {
          WebDownloader webDownloader = new WebDownloader();
          webDownloader.downLoader(url,name);
          System.out.println("下载了文件名为:"+name);
          return true;
      }
  
      public static void main(String[] args) throws ExecutionException, InterruptedException {
          Demo1 t1 = new Demo1("https://fanyi-cdn.cdn.bcebos.com/static/translation/widget/footer/Products/img/product-desktop@2x_119666c.png","1.jpg");
          Demo1 t2 = new Demo1("https://fanyi-cdn.cdn.bcebos.com/static/translation/widget/footer/Products/img/product-helper@2x_aa2eddc.png","2.jpg");
          //创建执行服务  线程池
          ExecutorService ser=Executors.newFixedThreadPool(3);
          //提交执行
          Future<Boolean> r1 = ser.submit(t1);
          Future<Boolean> r2 = ser.submit(t2);
          //获取结果
          Boolean rs1 = r1.get();
          Boolean rs2 = r2.get();
          //关闭服务
          ser.shutdown();
      }
  }
  //下载器
  class WebDownloader {
      public void downLoader(String url, String name) {
          try {
              FileUtils.copyURLToFile(new URL(url), new File(name));
          } catch (IOException e) {
              e.printStackTrace();
              System.out.println("IO 异常,Downloader方法出现问题");
          }
      }
  }

 

总结:

继承Thread类

  1.子类继承Thread 类具有多线程能力
  2.启动线程:子类对象.start()
  3.不建议使用:避免OOP单继承局限性

实现Runnable 接口
  1.实现接口Runnable 具有多线程能力
  2.启动线程:传入目标对象+Thread对象.start()
  3.推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用


 

该笔记,看狂神java视频学习

posted @ 2022-05-25 08:07  卷心菜-小白  阅读(38)  评论(0)    收藏  举报