首页 > 编程语言 >JAVA语言学习-Day6

JAVA语言学习-Day6

时间:2024-04-09 15:57:35浏览次数:23  
标签:JAVA 语言 Thread Day6 接口 仓库 线程 new 执行

程序、进程、线程

程序:指令与数据的有序集合,静态概念

进程:执行程序的一次执行过程,动态概念。是系统分配资源的单位

线程:一个进程中至少包含一个线程,通常一个进程中有若干个线程。线程是cpu调度和执行的单位

线程的创建

  • 继承thread类

  • 实现runnable接口

  • 实现callable接口

线程开启不一定立即执行,由cpu调度执行

//start();主线程调用start,开辟子线程执行run,多条执行路径,主线程和子线程并行交替执行
//run(); 主线程执行run,只有主线程一条执行路径
//callabe
ExecutorService ser = Executors.newFixedThreadPool(10);//创建线程池,线程池连接数为10
Future<V> r1 = ser.submit(new MyThread());//提交执行
V rs = r1.get();//获取结果
ser.shutdownNow();//关闭服务

FutureTask<V> futureTask = new FutureTask<V>(new MyThread());
new Thread(futureTask).start();
V v = futureTask.get();//V泛型
System.out.println(V);
   
class MyThread implements callable<V>{
   @Override
   public V call() throws Exception{
       return V;
  }
}

网图下载

//url网图地址,name保存的文件名
FileUtils.copyURLToFile(new URL(url),new File(name));

并发概念

多个线程同时操作同一个对象

静态代理

  • 真实对象和代理对象都要实现同一个接口

  • 代理对象要代理真实角色

Lambda表达式(jdk1.8)

  • 函数式接口

    • 任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口

    • 对于函数式接口,我们可以通过lambda表达式来创建该接口的对象

yield(线程礼让)

  • 礼让线程,让当前正在执行的线程暂停,但不阻塞

  • 将线程从运行状态转为就绪状态

  • 让cpu重新调度,礼让不一定成功

Thread.yield();

join线程强制执行

  • join合并线程,带此线程执行完成后,再执行其他线程,其他线程阻塞

线程状态观测

  1. NEW:尚未执行的线程

  2. RUNNABLE:在JAVA虚拟机中执行的线程

  3. BLOCKED:被阻塞等待监视器锁定的线程

  4. WAITING:正在等待另一个线程执行特定动作的线程

  5. TIMED_WAITING:正在等待另一个线程执行动作达到指定等待时间的线程

  6. TERMINATED:已退出的线程

Thread.state st = Thread.getState();
System.out.println(st);

守护线程(daemon)

  • 线程分为用户线程和守护线程

  • 虚拟机必须确保用户线程执行完毕

  • 虚拟机不必等待守护线程执行完毕

new Thread().setDaemon(true);//默认false表示用户线程,正常的线程都是用户线程

线程同步机制

synchronized

并发:同一个对象被多个线程同时操作

形成条件:队列和锁

CopyOnWriteArrayList //线程安全的

死锁

  1. 互斥条件:一个资源每次只能被一个进程使用

  2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获取的资源保持不放

  3. 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺

  4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系

Lock锁(jdk1.5)

  • Lock是显示锁(手动开启和关闭),synchronized是隐式锁,除了作用域自动释放

  • Lock只有代码块锁,synchronized有代码块锁和方法锁

  • 使用Lock锁,jvm将花费较少的时间来调度线程,性能更好。并且具有更好的拓展性(提供更多子类)

  • 优先使用顺序:Lock>同步代码块(已经进入了方法体,分配了相应资源)>同步方法(在方法体之外)

private final ReentrantLock lock = new ReentrantLock();
try{
   lock.lock();
}catch(){
   
}finally{
   lock.unlock();
}

线程协作

生产者消费者问题

  • 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中的产品取走消费

  • 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者取走为止

  • 如果仓库中放有产品,则消费者可以将产品取走消费,否则停止消费并等待,直到仓库中再次放入产品为止

解决方式

  1. 并发协作模型“生产者/消费者模式”--->管程法

    • 生产者将生产好的数据放入缓冲区,消费者从缓冲区拿出数据

  1. 并发协作模型“生产者/消费者模式”--->信号灯法

线程池

  • 背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大

  • 思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似现实生活中的公共交通工具

  • 好处

    1. 提高了响应速度(减少了创建新线程的时间)

    2. 降低资源消耗(重复利用线程池中的线程,不需要每次都创建)

    3. 便于线程管理(...)

      • corePoolSize:核心池的大小

      • maximumPoolSize:最大线程数

      • keeyAliveTime:线程没有任务时最多保持多长时间后会终止

ExecutorService service = new Executor.newFixedThreadPool(10);
service.execute(new Thread());
service.shutdown();
 

标签:JAVA,语言,Thread,Day6,接口,仓库,线程,new,执行
From: https://www.cnblogs.com/-Gin/p/18124132

相关文章

  • java设计模式回忆录
    java设计模式一.概念:在软件开发过程中的,经过验证的,在特定环境下重复发生特定问题的解决方案二.原则:OOP七项原则solid五项:功能的单一职责原则、开闭原则(便于扩展)、里氏替代原则(子类内代替父类)、接口隔离原则、依赖导致原则(依赖接口)迪米特原则(最小知道原则)、合成复用原则(用组合......
  • java计算机毕业设计元气花艺小程序【附源码+远程部署+程序+mysql】
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景在现代社会中,随着生活节奏的加快和城市化进程的推进,人们越来越渴望亲近自然、缓解压力。花艺作为一种艺术形式和生活方式,因其独特的审美价值和情感表达功......
  • java计算机毕业设计基于微信小程序的疫情封闭小区自助采购系统【附源码+远程部署+程序
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在新冠疫情的持续影响下,全球范围内的居民生活受到了前所未有的挑战。为了防控疫情的扩散,许多国家和地区不得不采取了封闭管理的措施,限制人员的流动和聚集......
  • 【C语言】练习:比较十个数的大小
    初始化一个数组,使用for循环输入;把数组中的第一个数字,也就是下标为[0]的数字赋值给一个int类型的变量“max”;使用循环从arr数组中下标为[1]的数字开始对比,如果arr[1]>arr[0],则把arr[1]赋值给max;最后打印出最大数。intmain(){ intarr[10]; for(inti=0;i<10;......
  • java计算机毕业设计基于微信小程序的瑜伽馆约课系统【附源码+远程部署+程序+mysql】
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义标题:基于微信小程序的瑜伽馆约课系统开发在现代都市生活的快节奏中,人们越来越注重身心健康与内在平衡。瑜伽作为一种集身体锻炼、心理放松与精神修养于一体的活动......
  • java stream流 获取最后一条数据
    JavaStream流获取最后一条数据在Java中,Stream是一种用于处理集合数据的抽象概念。Stream提供了一种函数式编程的方式来操作数据,可以通过一系列的操作来处理集合中的元素。本文将介绍如何使用JavaStream流获取最后一条数据。什么是JavaStream流JavaStream是Java8中引入的一......
  • 【C语言】练习:分数求和
    计算1/1-1/2+1/3-1/4+1/5……+1/99-1/100的值,打印出结果首先看题,分子不变为1,分母1-100;既然是分数计算,那结果肯定存在小数,所以在开始定义一个double类型的变量“num”;初始化一个int类型的变量“i”,使用for循环产出1-100的值;在for循环里使用if语句来判断分母是偶数......
  • C语言语法最后一个教案-教案21(预处理 · 头文件)
    最近给大家争取到一个深夜福利保证你在深夜手机刷到嘎嘎香~那就是 官方授权大流量卡缺点:月租太便宜 185GB~100分钟通话时长~长期套餐~畅想自由的气息流量自由的同时还拥有超长通话,而且免费领取。名额有限,咱们废话不多说直接上图。感兴趣的家人私我或者直接加微......
  • java 对Map<String, Object>遍历
    在Java中,你可以使用多种方法来遍历Map<String,Object>。以下是一些常见的方法:使用Map.Entry和IteratorjavaMap<String,Object>map=newHashMap<>();//添加一些键值对到map中Iterator<Map.Entry<String,Object>>iterator=map.entrySet().iterator();while(iterator.ha......
  • JavaSE笔记10数组入门
    数组的入门概念数组属于引用数据类型,其父类是Object数组可以容纳多个元素。(数组是一个数据的集合)数组可以存储基本和引用数据类型数组是引用类型,所以存储再堆内存中数组不能直接存储Java对象,但是可以存储其引用(内存地址)分类一维数组二维数组多维数组二维数组本质......