【Java基础】实训第九天

本文介绍了多线程的创建方法,包括继承Thread类和实现Runnable接口。讨论了多线程在下载文件、抢票等场景的应用,并指出线程数量并非越多越好。详细对比了进程与线程的区别,强调了线程安全问题,提出了解决方案如同步方法和同步代码块。此外,还探讨了单例模式的两种实现方式及其线程安全性。最后,列举了线程常用方法如join、getName、setName和setPriority,并分析了sleep()和wait()的区别以及它们在线程协作中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程

执行的分支(索引)

(串行、并行、并发、进程、线程)

  1. 如何创建线程?
  1. 继承Thread

  1. 实现Runnable接口

 

多线程的使用场景

多个线程分解庞大的分解,,比如:

  1. 下载文件(多个线程一起下载,下载的更快。因为单个线程获得cpu的运行概率不大)
  2. 抢票(创建多个线程一起抢,概率大)

但是要注意不是线程越多越好,内存消耗大

 

进程和线程区别?

  1. 每个进程都有独立的内存空间
  2. 一个进程至少要有一个线程
  3. 每创建一个线程都有自己的栈、本地方法区、程序计数器

run():指定线程的任务

Thread.currentThread().getName():获取当前线程的名字

继承方式VS实现接口

  1. 继承方式资源不共享,实现接口方式共享
  2. 继承方式无线程安全问题,实现接口方式有线程安全问题

线程不安全的含义?

多线程修改同一份资源带来的数据错乱

处理方案?

  1. 同步
  1. 同步方法

 

  1. 同步代码块

 

 

 

 

监(jiān)视(shì)对(duì)象(xiànɡ)一般是this或者字节码对象

 

  1. 加锁

线程安全

多线程修改同一份资源不会数据错乱

单例模式

  1. 饿汉式(无论如何先创建实例) 

  1. 懒汉式(需要的时候再创建实例,但是线程不安全)

 

 

  1. 方法一(同步方法)

 

 

  1. 方法二(同步代码块)

 

 

  1. 方法二的优化

 

 

如果已经有实例了,就直接返回,不需要让其他线程继续等浪费时间

线程的常用方法

  1. join
  2. getName
  3. setName
  4. setPriority

 

 

 

等到知道Thread的任务完成后才继续向下执行[插队]

join(long mills):插到main线程中停留多久

setPriority()并不是说一定会,而是增加了概率而已

 

 

two进不来,因为没让资源释放,没把锁打开。当one执行完,two进来了,但是此时的count0

Thead.sleep():让当前线程休眠,但是不会释放资源,不开锁

thread.wait():线程一直休眠,除非调用调用notify()唤醒

thread.wait(long timeout):休眠多少时间,当到底时间该线程会自动醒来

Sleep()和wait()的区别?

  1. Sleep()是线程的方法,wait()是Object的方法
  2. Sleep()不会释放资源,不释放锁。Wait()会
  3. Wait()可以无限等待(用notify/notifyAll唤醒)。。。
  4. 两者都是让线程休眠

notify/notifyAll()随机唤醒线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值