22day

day22

实现Runnable

  • 定义MyRunnable类实现Runnable接口

  • 实现run()方法,编写线程执行体

  • 创建线程对象,调用starts()方法启动线程

package com.wang.lesson01;
//创建线程方式2 实现runnable接口 重写run方法 执行线程需要丢入runnable接口实现类 调用start()
public class TestThread3 implements Runnable{
   public static void main(String[] args) {
       //主方法 main线程

       //创建runnable接口的实现类对象
       TestThread3 testThread3 = new TestThread3();
       //创建线程对象,通过开启线程对象来开启我们的线程,代理
       //Thread thread = new Thread(testThread3);
       //thread.start();
       new Thread(testThread3).start();
       for (int i = 0; i < 2000; i++) {
           System.out.println("我在学习多线程---"+i);
      }
  }

   @Override
   public void run() {
       //run方法线程体
       for (int i = 0; i < 20; i++) {
           System.out.println("我在学习---"+i);
      }
  }
}
package com.wang.lesson01;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;

public class TestThread4 implements Runnable{
       private String url;//网络图片地址
       private String name;//网络图片保存的名字

       public TestThread4(String url,String name){
           this.url = url;
           this.name = name;
      }


       @Override
       public void run() {
           WebDownLoader1 webDownLoader1 = new WebDownLoader1();
           webDownLoader1.downloader(url,name);
           System.out.println("下载的文件名为"+name);
      }

       public static void main(String[] args) {
           TestThread2 t1 = new TestThread2("https://assets.gitee.com/assets/giteego-7ec42270742374f05850d0d3ad09e303.png","303.png");
           TestThread2 t2 = new TestThread2("https://assets.gitee.com/assets/cloud_serverless-686cf926ced5d6d2f1d6e606d270b81e.png","81.png");
           TestThread2 t3 = new TestThread2("https://assets.gitee.com/assets/jenkins_for_gitee-554ec65c490d0f1f18de632c48acc4e7.png","47.png");

           new Thread(t1).start();
           new Thread(t2).start();
           new Thread(t3).start();

      }


}
//下载器
class WebDownLoader1{
   //下载方法
   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类

  • 子类继承Thread类具备多线程能力

  • 启动线程:子类对象 start()

  • 不建议使用:避免OOP单继承局限性

实现Runnable接口

  • 实现接口Runnable具有多线程能力

  • 启动线程:传入目标对象+Thread对象.start()

  • 推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用

//一份资源
StartThread station = new StartThread();

//多个代理
new Thread(station,"小明").start();
new Thread(station,"老师").start();
new Thread(station,"小红").start();

初识并发问题

package com.wang.lesson01;
//多个线程同时操作同一个对象
//买火车票

//问题 多个线程操作同一个资源的时候不安全 数据紊乱
public class TestThread5 implements Runnable{

   //票数
   private int ticketNums = 10;

   @Override
   public void run() {

       while(ticketNums!=0){
           //模拟延时
           try {
               Thread.sleep(200);
          } catch (InterruptedException e) {
               e.printStackTrace();
          }
           if (ticketNums<=0){
               break;
          }

           System.out.println(Thread.currentThread().getName()+"--->拿到了第"+ticketNums--+"票");
      }
  }

   public static void main(String[] args) {
       TestThread5 testThread5 = new TestThread5();
       new Thread(testThread5,"夏明").start();
       new Thread(testThread5,"夏雨").start();
       new Thread(testThread5,"夏风").start();
  }
}

龟兔赛跑

龟兔赛跑

package com.wang.lesson01;

import java.security.PrivateKey;

//模拟龟兔赛跑
public class Race implements Runnable{
   //胜利者
   private static String winner;

   @Override
   public void run() {
       for (int i = 1; i <= 100; i++) {

           //模拟兔子休息
           if (Thread.currentThread().getName().equals("兔") && i%50==0){
               try {
                   Thread.sleep(1);
              } catch (InterruptedException e) {
                   e.printStackTrace();
              }
          }
           //判断比赛是否结束
           boolean flag = gameOver(i);
           //比赛结束了停止程序
           if (flag){
               break;
          }
           System.out.println(Thread.currentThread().getName()+"--->跑了"+i+"步");
      }
  }

   //判断是否完成比赛
   private boolean gameOver(int steps){
       //判断是否有胜利者
       if (winner!=null){//已经存在胜利者了
           return true;
      }else {
           if (steps>=100){
               winner=Thread.currentThread().getName();
               System.out.println("winner is"+winner);
               return true;
          }
      }
       return false;
  }

   public static void main(String[] args) {
       Race race = new Race();
       new Thread(race,"龟").start();
       new Thread(race,"兔").start();
  }
}

Callable接口

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

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

  3. 创建目标对象

  4. 创建执行服务:ExecutorService ser = Executors.newFixedThreadPoo(1);

  5. 提交执行:Future<Boolean> result1=ser.submit(t1);

  6. 获取结果:boolean r1 = result1.get();

  7. 关闭服务:ser.shutdownNow();

package com.wang.lesson02;
//线程创建方式三 实现Callable接口

import com.wang.lesson01.TestThread2;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;
/*
callable优势
1.可以定义返回值
2.可以抛出异常
*/
public class TestCallable implements Callable<Boolean> {
   private String url;//网络图片地址
   private String name;//网络图片保存的名字

   public TestCallable(String url, String name){
       this.url = url;
       this.name = name;
  }


   @Override
   public Boolean call() {
       WebDownLoader webDownLoader = new WebDownLoader();
       webDownLoader.downloader(url,name);
       System.out.println("下载的文件名为"+name);
       return true;
  }

   public static void main(String[] args) throws ExecutionException, InterruptedException {
       TestCallable t1 = new TestCallable("https://assets.gitee.com/assets/giteego-7ec42270742374f05850d0d3ad09e303.png","303.png");
       TestCallable t2 = new TestCallable("https://assets.gitee.com/assets/cloud_serverless-686cf926ced5d6d2f1d6e606d270b81e.png","81.png");
       TestCallable t3 = new TestCallable("https://assets.gitee.com/assets/jenkins_for_gitee-554ec65c490d0f1f18de632c48acc4e7.png","47.png");

       //1. 创建执行服务:
       ExecutorService ser = Executors.newFixedThreadPool(3);
       //2. 提交执行:
       Future<Boolean> result1=ser.submit(t1);
       Future<Boolean> result2=ser.submit(t2);
       Future<Boolean> result3=ser.submit(t3);
       //3. 获取结果:
       boolean r1 = result1.get();
       boolean r2 = result2.get();
       boolean r3 = result3.get();

       System.out.println(r1);
       System.out.println(r2);
       System.out.println(r3);
       //4. 关闭服务:
       ser.shutdownNow();

  }

}
//下载器
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方法出现异常");
      }
  }
}

 

posted @ 2021-04-29 22:03  卧剑之鱼  阅读(153)  评论(0)    收藏  举报