首页 > 其他分享 >并发问题和实现Callable接口

并发问题和实现Callable接口

时间:2023-08-24 15:36:49浏览次数:38  
标签:String Thread url 接口 Callable 并发 new public name

并发

1.初识并发问题
// 多个线程同时操作一个对象
// 买火车票
// 发现问题:多个线程操作同一个资源的情况下,线程不安全
public class TestThread4 implements Runnable{
   // 票数
   private int ticketNums = 10;

   public void run(){
       while (true){
           if (this.ticketNums <= 1){
               break;
          }
           // 模拟延时
           try {
               Thread.sleep( 200);
          } catch (Exception e) {
               e.printStackTrace();
          }

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

   public static void main(String[] args) {
       TestThread4 ticket = new TestThread4();
       new Thread(ticket,"小明").start();
       new Thread(ticket,"老师").start();
       new Thread(ticket,"黄牛").start();
  }

}
2.龟兔赛跑案例
// 模拟龟兔赛跑
public class Race implements Runnable{
   // 定义胜利者
   private static  String winner;

   @Override
   public void run() {
       for (int i = 0; i <= 100; i++) {
           // 模拟兔子休息
           if(Thread.currentThread().getName() == "兔子"){
               try {
                   Thread.sleep(100);
              } catch (InterruptedException e) {
                   e.printStackTrace();
              }
          }

           // 判断比赛是否结束
           boolean flag = this.gameOver(i);
           //如果比赛结束
           if(flag){
               break;
          }
           System.out.println(Thread.currentThread().getName() + "---->跑了"+i+"步");
      }
  }
   private boolean gameOver(int step){
       // 判断是否有胜利者
       if(winner !=null){
           return  true;
      }else {
           if(step >= 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();
  }
}
3.实现Callable接口
  1. 实现Callable接口,需要返回值类型。

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

  3. 创建目标对象。

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

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

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

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

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;

// 线程实现方式三
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://img0.baidu.com/it/u=3021883569,1259262591&fm=253&app=120&size=w931&n=0&f=JPEG&fmt=auto?sec=1692982800&t=5858b3800995bb2c1af459caaab34932", "1.jpg");
       TestCallable t2 = new TestCallable("https://img0.baidu.com/it/u=3021883569,1259262591&fm=253&app=120&size=w931&n=0&f=JPEG&fmt=auto?sec=1692982800&t=5858b3800995bb2c1af459caaab34932", "2.jpg");
       TestCallable t3 = new TestCallable("https://img0.baidu.com/it/u=3021883569,1259262591&fm=253&app=120&size=w931&n=0&f=JPEG&fmt=auto?sec=1692982800&t=5858b3800995bb2c1af459caaab34932", "3.jpg");

       // 创建执行服务
       ExecutorService ser = Executors.newFixedThreadPool(3);

       // 提交换行
       Future<Boolean> r1 = ser.submit(t1);
       Future<Boolean> r2 = ser.submit(t2);
       Future<Boolean> r3 = ser.submit(t3);

       // 获取结果
       boolean rs1 = r1.get();
       boolean rs2 = r2.get();
       boolean rs3 = r3.get();

       // 关闭服务
       ser.shutdownNow();
  }
   public static 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出现问题");
      }
  }
}

// 下载器
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出现问题");
      }
  }
}
 

标签:String,Thread,url,接口,Callable,并发,new,public,name
From: https://www.cnblogs.com/yuan947022015/p/17654228.html

相关文章

  • 《asyncio 系列》1. 什么是 asyncio?如何基于单线程实现并发?事件循环又是怎么工作的?
    https://www.cnblogs.com/traditional/p/17357782.html楔子许多应用程序,尤其在当今的Web应用程序领域,严重依赖IO操作。这些类型的操作包括从Intermet下载网页的内容、通过网络与一组微服务进行通信,或者针对MySOL、Postgres等数据库同时运行多个查询。Web请求或与微服......
  • 关于前端接口的formData传参
    工作中遇到个简单的问题,后端提供接口需要前端用formdata传文件和普通对象参数拼接的参数;本来是个简单的问题,记录一下做个简单的总结顺便梳理下相关基础性知识点:1.formdata将数据转换成键值对进行传参,key是唯一,一个key可以对应多个value,如果是使用表单初始化,每个表单字段对......
  • 接口设计中的版本号
    今天呢,闲来无事,想到了接口设计的版本号的一些知识,特此来简单的说下API接口设计中的Version版本号。我们在接口的日常开发中,肯定都避免不了接口永成不变,那么就会出现接口变更,那么接口变更又是怎么区分的呢?接口变更又会不会对老接口有什么影响或者其他的呢,说了这么多,这就引出了一......
  • pyhton解决高并发问题
    pyhton解决高并发问题#前端: 1.cdn加速,就是内容分发网络,简单来说就是把静态资源放到别的服务器上 2.精灵图:就是一个大的图片上面有多个我们需要的小图,用定位的方法,定位到不同的小图,满足我们的需求。这样一个请求拿到的图就可以用在多个位置。3.前端缓存:在返回的响应头里......
  • 14 Linux 并发与竞争
    一、并发与竞争  并发:多个执行单元同时、并行执行。  竞争:并发的执行单元同时访问共享资源(硬件资源和软件上的全局变量等)易导致竞态。 二、原子操作1.原子操作简介  原子操作:不能再进一步分割的操作,一般用于变量或位操作。  例如在C语言中对无符号整型变量......
  • c# .NET 高级编程 高并发必备技巧(二) - 分布式锁
    上一篇文章简单的介绍了单机的情况下如何进行加锁,防止高并发带来的问题。然而现实中,一般会高并发的应用,很少会单机部署。当用户量达到一定的程度,分布式、集群部署是必然的选择。在分布式部署的情况下,之前的单机锁还会有效吗?代码还是之前的代码:privatestaticobjectlck=......
  • OS(二十三):接口之系统调用
    操作系统是用户与计算机硬件系统之间的接口。OS向用户提供了用户接口和程序接口两类接口。用户接口:操作系统为用户提供的用户与操作系统的接口。程序接口:操作系统向编程人员提供程序与操作系统的接口。1、系统调用程序接口是OS专门为各用户程序设置的,是用......
  • pytestx重新定义接口框架设计
    概览脚手架:目录:用例代码:"""测试登录到下单流程,需要先启动后端服务"""test_data={"查询SKU":{"skuName":"电子书"},"添加购物车":{"skuId":123,"skuNum":......
  • Sentinel实现接口流量控制
    简介Sentinel是阿里巴巴开源的限流器熔断器,并且带有可视化操作界面。启动控制台下载地址java-Dserver.port=8089-Dcsp.sentinel.dashboard.server=localhost:8089-Dproject.name=sentinel-dashboard-jarsentinel-dashboard-1.8.6.jar注意不要使用windows下的PowerShel......
  • SIT1040Q 5V 供电,±40V 接口耐压,1Mbps 高速 CAN 总线收发器
    SIT1040Q是一款应用于CAN协议控制器和物理总线之间的接口芯片,可应用于卡车、公交、小汽车、工业控制等领域,速率可达到1Mbps,具有在总线与CAN协议控制器之间进行差分信号传输的能力。完全兼容“ISO11898”标准;符合AEC-Q100要求;内置过温保护;过流保护功能;显性超时......