java高级特性 - 多线程基础(2)常用函数,零基础入门到精通,收藏这篇就够了


目录

第1关:线程的状态与调度

第2关:常用函数(一)

第3关:常用函数(二)

第1关:线程的状态与调度

相关知识

为了完成本关你需要掌握:

1.线程的状态与调度;

2.线程执行的优先级。

线程的状态与调度

如果看懂下图,你对线程的了解就会更上一层楼。

  1. 当我们使用new关键字新建一个线程,这个时候线程就进入了新建状态(New),也就是图中未启动状态;

  2. 调用start方法启动线程,这个时候就进入了可运行状态,也就是就绪状态(Runnable);

  3. 就绪状态获取了CPU资源,开始执行run方法,就进入了运行状态(Running);

  4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种;

  • 等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。(wait会释放持有的锁);
  • 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中;
  • 其他阻塞:运行的线程执行sleep()join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。(注意,sleep是不会释放持有的锁);
  1. 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

线程优先级

我们知道,多个线程的执行是随机的,在一个时段执行哪个线程是看哪一个线程在此时拥有CPU的执行权限。

Java中线程有优先级,优先级高的线程会获得较多的运行机会。

Java线程的优先级用整数表示,取值范围是1~10Thread类有以下三个静态常量:

  1. static int MAX_PRIORITY
  2. 线程可以具有的最高优先级,取值为10。
  3. static int MIN_PRIORITY
  4. 线程可以具有的最低优先级,取值为1。
  5. static int NORM_PRIORITY
  6. 分配给线程的默认优先级,取值为5。

如果要设置和获取线程的优先级,可以使用Thread类的setPriority()getPriority()方法。

每个线程都有默认的优先级。主线程的默认优先级为Thread.NORM_PRIORITY

线程的优先级有继承关系,比如A线程中创建了B线程,那么B将和A具有相同的优先级。

JVM提供了10个线程优先级,但与常见的操作系统都不能很好的映射。如果希望程序能移植到各个操作系统中,应该仅仅使用Thread类有以下三个静态常量作为优先级,这样能保证同样的优先级采用了同样的调度方式。

关于线程调度与优先级你还需要了解:

  1. 线程睡眠:Thread.sleep(long millis)方法,使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。sleep()平台移植性好。
  2. 线程等待:Object类中的wait()方法,导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()唤醒方法。这个两个唤醒方法也是Object类中的方法,行为等价于调用wait(0)一样。
  3. 线程让步:Thread.yield()方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。
  4. 线程加入:join()方法,等待其他线程终止。在当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态,直到另一个进程运行结束,当前线程再由阻塞转为就绪状态。
  5. 线程唤醒:Object类中的notify()方法,唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个wait方法,在对象的监视器上等待。 直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。类似的方法还有一个notifyAll(),唤醒在此对象监视器上等待的所有线程。

第2关:常用函数(一)

相关知识

本关你需要掌握sleepjoin函数的用法。

sleep()函数

sleep(long millis): 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。

使用方式很简单在线程的内部使用Thread.sleep(millis)即可。

sleep()使当前线程进入停滞状态(阻塞当前线程),让出CPU的使用,目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会;

sleep()休眠时间期满后,该线程不一定会立即执行,这是因为其它线程可能正在运行而且没有被调度为放弃执行,除非此线程具有更高的优先级。

join()函数

join函数的定义是指:等待线程终止。

我们在运行线程的时候可能会遇到,在主线程中运行子线程,主线程需要获取子线程最终执行结果的情况。

但是有很多时候子线程进行了很多耗时的操作,主线程往往先于子线程结束,这个时候主线程就获取不到子线程的最终执行结果了。

使用join函数,可以解决这一问题。

我们通过两个示例来理解:

不使用join函数的版本:

class MyThread extends Thread { private String name; public MyThread(String name) { this.name = name; } public void run() { System.out.println("子线程开始运行"); for (int i = 0; i < 5; i++) { System.out.println("子线程" + name + "运行" + i); try { Thread.sleep(30); } catch (InterruptedException e) { e.printStackT\frace(); } } System.out.println("子线程结束"); } } public class Test { public static void main(String[] args) { Thread t = new MyThread("子线程A"); t.start(); for (int i = 0; i < 5; i++) { System.out.println("主线程执行" + i); } System.out.println("主线程结束"); } }

输出结果(每次都不一样):

主线程执行0主线程执行1主线程执行2主线程执行3主线程执行4主线程结束子线程开始运行子线程子线程A运行0子线程子线程A运行1子线程子线程A运行2子线程子线程A运行3子线程子线程A运行4子线程结束

可以发现每次运行,主线程都是先于子线程结束的。

使用join函数:

package step1; class MyThread extends Thread { private String name; public MyThread(String name) { this.name = name; } public void run() { System.out.println("子线程开始运行"); for (int i = 0; i < 5; i++) { System.out.println("子线程" + name + "运行" + i); try { Thread.sleep(30); } catch (InterruptedException e) { e.printStackT\frace(); } } System.out.println("子线程结束"); } } public class Test { public static void main(String[] args) { Thread t = new MyThread("子线程A"); t.start(); for (int i = 0; i < 5; i++) { System.out.println("主线程执行" + i); } try { t.join(); } catch (Exception e) { e.printStackT\frace(); } System.out.println("主线程结束"); } }

输出结果:

主线程执行0主线程执行1主线程执行2主线程执行3子线程开始运行主线程执行4子线程子线程A运行0子线程子线程A运行1子线程子线程A运行2子线程子线程A运行3子线程子线程A运行4子线程结束主线程结束

可以发现无论运行多少次,主线程都会等待子线程结束之后在结束。

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

  • 创建自定义线程,实现求第num项斐波那契数列的值num0开始,并且在main函数中获取子线程最终计算的结果。

测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

输入:5输出:子线程计算结果为:5

输入:8输出:子线程计算结果为:21

输入:10输出:子线程计算结果为:55

/*获取子线程执行的结果并输出*/ package step2; import java.util.Scanner; public class Task { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); //请在此添加实现代码 /********** Begin **********/ Thread t=new MyThread("子线程",num); t.start(); /********** End **********/ } } //请在此添加实现代码 /********** Begin **********/ class MyThread extends Thread { private int num;// 需要计算的斐波那契数列的项数 private String name; // 线程名称 public MyThread(String name,int num){ this.num=num; this.name=name; } public void run(){ int[] arr = new int[2]; arr[0] = 1; arr[1] = 1; for(int i=2; i<num; i++){ int tmp =arr[1]; arr[1]=arr[0]+arr[1]; arr[0]=tmp; } // 输出结果 System.out.println("子线程计算结果为:" + arr[1]); } } /********** End **********/

第3关:常用函数(二)

相关知识

为了完成本关任务你需要掌握:

1.yield函数的用法;

2.wait函数的用法;

3.其他常用函数的使用。

yield 函数

yield函数可以理解为“让步”,它的作用是:暂停当前正在执行的线程对象,并执行其他线程。

yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。

示例:

public class Task { public static void main(String[] args) { System.out.println(Thread.currentThread().getName()+"主线程运行开始!"); MyThread mTh1=new MyThread("A"); MyThread mTh2=new MyThread("B"); mTh1.start(); mTh2.start(); System.out.println(Thread.currentThread().getName()+ "主线程运行结束!"); } } class MyThread extends Thread { private String name; public MyThread(String name) { this.name = name; } public void run() { for (int i = 0; i < 50; i++) { System.out.println(name + "线程" + "执行" + i); if(i == 10){ this.yield(); } } } }

运行结果有两种情况:

第一种情况:A(线程)当执行到10时会让掉CPU时间,这时B(线程)抢到CPU时间并执行。

第二种情况:B(线程)当执行到10时会让掉CPU时间,这时A(线程)抢到CPU时间并执行。

我们还可以考虑在其中加入setPriority函数改变线程优先级从而改变线程的执行顺序。

wait 函数

要弄明白wait函数我们首先需要了解线程锁的概念。 线程锁:其实就像我们日常生活中的锁,如果一个房子上了锁,别人就进不去,在Java中也类似,如果一段代码取得了锁,那么其他地方就不能运行这段代码,只能等待锁的释放。

这里我们会涉及到两个函数,1.wait(),2.notify()。这两个函数都是Object类自带的函数。

在下面的例子中我们会使用synchronized(Obj)来实现线程同步,同步的概念后面会讲到,这里不理解没关系,不影响对于wait函数的理解。

从功能上来说:

  • wait()就是说线程在获取对象锁后,主动释放对象锁,同时本线程休眠。直到有其它线程调用对象的notify()唤醒该线程,才能继续获取对象锁,并继续执行;

  • 相应的notify()就是对对象锁的唤醒操作。

但有一点需要注意的是notify()调用后,并不是马上就释放对象锁的,而是在相应的synchronized(){}语句块执行结束,自动释放锁后,JVM会在wait()对象锁的线程中随机选取一线程,赋予其对象锁,唤醒线程,继续执行。这样就提供了在线程间同步、唤醒的操作。

Thread.sleep()Object.wait()二者都可以暂停当前线程,释放CPU控制权,主要的区别在于Object.wait()在释放CPU同时,释放了对象锁的控制。

纸上得来终觉浅,欲知此事须躬行,我们还是通过实例来学习这些函数的用法。

问题:建立两个线程,A线程打印5A,B线程打印5B,要求线程同时运行,交替打印5AB

这个问题用Objectwait()notify()就可以很方便的解决。代码如下:

public class MyThread implements Runnable { private String name; private Object prev; private Object self; private MyThread(String name, Object prev, Object self) { this.name = name; this.prev = prev; this.self = self; } public void run() { int count = 5; while (count > 0) { synchronized (prev) { synchronized (self) { System.out.print(name); count--; self.notify(); } try { prev.wait(); } catch (InterruptedException e) { e.printStackT\frace(); } } } System.exit(0);//退出jvm } public static void main(String[] args) throws Exception { Object a = new Object(); Object b = new Object(); MyThread ta = new MyThread("A", b, a); MyThread tb = new MyThread("B", a, b); new Thread(ta).start(); Thread.sleep(100); //确保按顺序A、B执行 new Thread(tb).start(); Thread.sleep(100); } }

运行程序,结果为:

ABABABABAB

线程常用函数总结

下表列出的是线程类常用的函数:

函数描述
public void start()使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
public void run()如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
public final void setName(String name)改变线程名称,使之与参数 name 相同。
public final void setPriority(int priority)更改线程的优先级。
public final void setDaemon(boolean on)将该线程标记为守护线程或用户线程。
public final void join(long millisec)等待该线程终止的时间最长为 millis 毫秒
public void interrupt()中断线程。
public final boolean isAlive()测试线程是否处于活动状态。
public static void yield()暂停当前正在执行的线程对象,并执行其他线程。
public static void sleep(long millisec)在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
public static boolean holdsLock(Object x)当且仅当当前线程在指定的对象上保持监视器锁时,才返回 true。
public static Thread currentThread()返回对当前正在执行的线程对象的引用。
public static void dumpStack()将当前线程的堆栈跟踪打印至标准错误流。

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

  • 建立三个线程,A线程打印5E,B线程打印5DC线程打印5U,要求线程同时运行,交替打印5EDU
/** 使用三个线程交替打印5次EDU。 */ package step3; public class MyThread implements Runnable { /********** Begin **********/ private String name; private Object prev; private Object self; //构造函数,初始化线程名字、前一锁对象和自己的锁对象 private MyThread(String name,Object prev,Object self){ this.name = name; this.prev = prev; this.self = self; } //实现Runnable接口的run方法 public void run(){ //先设定循环次数 int count = 5; //循环输出线程名字 while(count>0){ //获取前一锁对象的监视器锁 synchronized(prev){ //获取自己锁对象的监视器锁 synchronized(self){ //输出线程名字 System.out.print(name); //修改循环次数 count--; //唤醒在当前锁对象上等待的线程 self.notify(); } try { //释放前一锁对象的监视器锁,使线程进入等待状态 prev.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } //退出程序 System.exit(0); } //主方法 public static void main(String[] args) throws Exception { //创建三个锁对象 Object a = new Object(); Object b = new Object(); Object c = new Object(); //创建三个线程对象,分别传入线程名字和前一个锁对象、自己的锁对象 MyThread ta = new MyThread("E",c,a); MyThread tb = new MyThread("D",a,b); MyThread tc = new MyThread("U",b,c); //创建三个线程并启动 new Thread(ta).start(); Thread.sleep(100); new Thread(tb).start(); Thread.sleep(100); new Thread(tc).start(); Thread.sleep(100); } /********** End **********/ }

Java开发的就业市场正在经历结构性调整,竞争日益激烈

传统纯业务开发岗位(如仅完成增删改查业务的后端工程师)的需求,特别是入门级岗位,正显著萎缩。随着企业技术需求升级,市场对Java人才的要求已从通用技能转向了更深入的领域经验(如云原生、微服务)或前沿的AI集成能力。这也导致岗位竞争加剧,在一、二线城市,求职者不仅面临技术内卷,还需应对学历与项目经验的高门槛。

大模型为核心的AI领域正展现出前所未有的就业热度与人才红利

2025年,AI相关新发岗位数量同比激增543%,单月增幅最高超过11倍,大模型算法工程师位居热门岗位前列。行业顶尖人才的供需严重失衡,议价能力极强,跳槽薪资涨幅可达30%-50%。值得注意的是,市场并非单纯青睐算法研究员,而是急需能将大模型能力落地于复杂业务系统的工程人才。这使得具备企业级架构思维和复杂系统整合经验的Java工程师,在向“Java+大模型”复合人才转型时拥有独特优势,成为企业竞相争夺的对象,其薪资天花板也远高于传统Java岗位。

说真的,这两年看着身边一个个搞Java、C++、前端、数据、架构的开始卷大模型,挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis,稳稳当当过日子。

结果GPT、DeepSeek火了之后,整条线上的人都开始有点慌了,大家都在想:“我是不是要学大模型,不然这饭碗还能保多久?”

先给出最直接的答案:一定要把现有的技术和大模型结合起来,而不是抛弃你们现有技术!掌握AI能力的Java工程师比纯Java岗要吃香的多。

即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地!大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇!

如何学习AGI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版CSDN大礼包:《AGI大模型学习资源包》免费分享**

一、2025最新大模型学习路线

一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

L1级别:AI大模型时代的华丽登场

L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理,关键技术,以及大模型应用场景;通过理论原理结合多个项目实战,从提示工程基础到提示工程进阶,掌握Prompt提示工程。

L2级别:AI大模型RAG应用开发工程

L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3级别:大模型Agent应用架构进阶实践

L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体;同时还可以学习到包括Coze、Dify在内的可视化工具的使用。

L4级别:大模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调;并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握;而L3 L4更多的是通过项目实战来掌握大模型的应用开发,针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。

二、大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

三、大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

四、大模型项目实战

学以致用,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

五、大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版CSDN大礼包:《AGI大模型学习资源包》免费分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1135584.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

批量生成视频时如何避免资源冲突?

批量生成视频时如何避免资源冲突&#xff1f; 引言&#xff1a;批量生成的挑战与背景 随着多模态生成技术的发展&#xff0c;Image-to-Video&#xff08;I2V&#xff09;模型在内容创作、广告设计、影视预演等场景中展现出巨大潜力。基于 I2VGen-XL 的图像转视频系统允许用户将…

CUDA out of memory怎么办?显存优化终极方案

CUDA out of memory怎么办&#xff1f;显存优化终极方案 Image-to-Video图像转视频生成器 二次构建开发by科哥 在基于 I2VGen-XL 模型的 Image-to-Video 图像转视频生成系统 开发过程中&#xff0c;我们频繁遇到一个核心瓶颈&#xff1a;CUDA out of memory&#xff08;显存溢出…

Image-to-Video模型部署避坑指南:显存优化技巧

Image-to-Video模型部署避坑指南&#xff1a;显存优化技巧 引言&#xff1a;从开发到落地的显存挑战 在基于 I2VGen-XL 模型构建的 Image-to-Video 图像转视频系统中&#xff0c;尽管其生成能力令人惊艳——能将静态图像转化为自然流畅的动态视频&#xff0c;但在实际部署过程中…

用Sambert-HifiGan做游戏NPC语音:打造真正有情感的虚拟角色

用Sambert-HifiGan做游戏NPC语音&#xff1a;打造真正有情感的虚拟角色 引言&#xff1a;让NPC“说人话”——从机械朗读到情感化表达 在传统游戏中&#xff0c;NPC&#xff08;非玩家角色&#xff09;的语音大多依赖预录音频或基于规则的TTS&#xff08;文本转语音&#xff…

第一次使用就成功?新手必问的10个问题解答

第一次使用就成功&#xff1f;新手必问的10个问题解答 &#x1f4d6; 引言&#xff1a;为什么新手也能快速上手&#xff1f; 你是否曾担心 AI 视频生成技术门槛太高&#xff0c;需要复杂的代码调试和参数调优&#xff1f;现在&#xff0c;随着 Image-to-Video 图像转视频生成器…

‌测试配置变更韧性:滚动更新

配置变更韧性与滚动更新的核心概念‌ 在软件测试领域&#xff0c;配置变更韧性&#xff08;Configuration Change Resilience&#xff09;指系统在配置更新过程中维持高可用性、性能和稳定性的能力。随着云原生和微服务架构的普及&#xff0c;滚动更新&#xff08;Rolling Upd…

百度UE如何通过组件扩展实现Word文档的版本兼容?

企业网站内容管理系统Word导入与公众号内容粘贴解决方案 作为安徽集团上市公司项目负责人&#xff0c;针对您描述的企业网站后台管理系统文章发布模块功能升级需求&#xff0c;我为您提供以下专业解决方案。 一、需求分析与技术方案 1.1 核心功能需求 Word粘贴功能&#xf…

未来内容创作模式:静态图自动转动态视频的技术演进

未来内容创作模式&#xff1a;静态图自动转动态视频的技术演进 技术背景与行业趋势 在数字内容爆炸式增长的今天&#xff0c;视频内容已成为信息传播的核心载体。据最新统计&#xff0c;全球每天生成的短视频内容超过10亿条&#xff0c;而专业级视频制作却仍面临成本高、周期长…

百度网盘高速下载终极指南:一键解析直链实现满速下载

百度网盘高速下载终极指南&#xff1a;一键解析直链实现满速下载 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘下载速度慢而苦恼吗&#xff1f;通过百度网盘直…

社交媒体运营提效:批量生成短视频素材流程拆解

社交媒体运营提效&#xff1a;批量生成短视频素材流程拆解 在当前内容为王的社交媒体生态中&#xff0c;短视频已成为品牌曝光、用户互动和流量转化的核心载体。然而&#xff0c;高质量视频内容的持续产出对运营团队提出了巨大挑战——人力成本高、制作周期长、创意枯竭等问题频…

用Sambert-HifiGan为智能镜子添加语音交互功能

用Sambert-HifiGan为智能镜子添加语音交互功能 &#x1f4cc; 技术背景&#xff1a;让智能镜子“开口说话” 随着智能家居设备的普及&#xff0c;用户对人机交互体验的要求不断提升。传统的触控或按键操作已无法满足自然、直观的交互需求&#xff0c;语音交互正成为智能硬件的核…

批量处理脚本编写:自动化生成上百个视频

批量处理脚本编写&#xff1a;自动化生成上百个视频 引言&#xff1a;从单次交互到批量生产的工程跃迁 在当前AIGC&#xff08;人工智能生成内容&#xff09;快速发展的背景下&#xff0c;图像转视频&#xff08;Image-to-Video, I2V&#xff09;技术正逐步成为数字内容创作的重…

用Sambert-HifiGan打造虚拟主播:情感语音合成实战

用Sambert-HifiGan打造虚拟主播&#xff1a;情感语音合成实战 &#x1f4cc; 引言&#xff1a;让虚拟主播“声”动起来 在虚拟主播、AI助手、有声书生成等应用场景中&#xff0c;自然且富有情感的语音合成&#xff08;TTS&#xff09; 已成为提升用户体验的核心能力。传统的TTS…

Sambert-HifiGan在智能家居中的语音场景设计

Sambert-HifiGan在智能家居中的语音场景设计 引言&#xff1a;中文多情感语音合成的智能交互新范式 随着智能家居生态的不断演进&#xff0c;用户对人机交互体验的要求已从“能用”升级为“好用且有温度”。传统TTS&#xff08;Text-to-Speech&#xff09;系统往往输出机械、单…

Baklib 提升教育行业内容管理与智能体验

在数字化浪潮推动下&#xff0c;学校与教育机构的内容管理、资源共享与用户体验需求正快速增长。Baklib 针对教育行业构建了一套全面的一体化教育内容管理与数字体验平台&#xff0c;覆盖从学校门户、站群管理、知识共享&#xff0c;到 AI 智能检索与个性化学习体验等关键需求&…

格局清晰了!CES 2026后,这五类中国机器人公司最受资本追捧

拉斯维加斯&#xff0c;2026年1月——当全球科技界的聚光灯再次打在拉斯维加斯会展中心&#xff08;LVCC&#xff09;的穹顶之下&#xff0c;一年一度的科技“春晚”CES如期拉开帷幕。与往年不同的是&#xff0c;AI与机器人已不再是展区一角的未来概念&#xff0c;而是真正站上…

Android 数据库实操指南:从 SQLite 到 Realm,不同场景精准匹配

在移动应用开发过程中&#xff0c;数据库的选型与实现是必不可少的一环&#xff0c;数据的持久化存储直接影响应用的稳定与体验。本文将系统梳理Android平台常见的几种数据库方案&#xff0c;包括SQLite、Room与Realm&#xff0c;通过对比其特点、适用场景及基本操作&#xff0…

*领域工程阶段**:通过领域分析和构件可变性分析,识别共性需求与变化点,建立可复用的构件库

基于构件的开发模型 该模型以“可复用构件”为核心&#xff0c;分为两个主要阶段&#xff1a; 领域工程阶段&#xff1a;通过领域分析和构件可变性分析&#xff0c;识别共性需求与变化点&#xff0c;建立可复用的构件库&#xff0c;并输出领域模型和领域基准体系结构图。应用系…

百度网盘密码智能解析:告别繁琐搜索的全新体验

百度网盘密码智能解析&#xff1a;告别繁琐搜索的全新体验 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 当你面对一个期待已久的百度网盘分享链接&#xff0c;却因缺少提取码而停滞不前时&#xff0c;那种失落感一定很熟悉。…

Sambert-HifiGan在智能零售领域的语音交互应用

Sambert-HifiGan在智能零售领域的语音交互应用 引言&#xff1a;让AI声音更懂“情绪”的零售服务 随着智能零售场景的不断演进&#xff0c;传统机械式语音播报已无法满足用户对自然、亲和、个性化交互体验的需求。从无人便利店到智能货架&#xff0c;从自助收银机到导购机器人&…