package top.qaqaq.java.P443; /** * 线程通信的应用:经典例题:生产者/消费者问题 * * 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品, * 店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员 * 会叫生产者停一下,如果店中有空…
package top.qaqaq.java.P441; /** * 线程通信的例子:使用两个线程打印 1-100。线程1, 线程2 交替打印 * * 涉及到的三个方法: * wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器。 * notify():一旦执行此方法,就会唤醒被wait的一个线程。如果有多个线程被wait,就唤醒…
package top.qaqaq.java.P440; /** * 银行有一个账户。 * 有两个储户分别向同一个账户存3000元,每次存1000,存3次。每次存完打印账户余额。 * * 分析: * 1.是否是多线程问题?是,两个储户线程 * 2.是否有共享数据?有,账户(或账户余额) * 3.是否有线程安全问题?有 * 4.需要考虑如何解决线程安…
package top.qaqaq.java.P439; import java.util.concurrent.locks.ReentrantLock; /** * 解决线程安全问题的方式三:Lock锁 --- JDK5.0新增 * * 1. 面试题:synchronized 与 Lock 的异同? * 相同:二者都可以解决线程安全问题 * 不同…
package top.qaqaq.java.P438; /** * 演示线程的死锁问题 * * 1.死锁的理解:不同的线程分别占用对方需要的同步资源不放弃, * 都在等待对方放弃自己需要的同步资源,就形成了线程的死锁 * * 2.说明: * 1)出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于阻塞状态,无法继续 * 2)我们使用同步时…
package top.qaqaq.java.P437; /** * 使用同步机制将单例模式中的懒汉式改写为线程安全的 * * @author RichieZhang * @create 2022-10-21 下午 1:38 */ public class BankTest { } class Bank { private Bank() { } p…
package top.qaqaq.java.P436; /** * 使用同步方法处理继承Thread类的方式中的线程安全问题 * * @author RichieZhang * @create 2022-10-21 下午 1:22 */ class Window4 extends Thread { private static int ticke…
package top.qaqaq.java.P435; /** * 使用同步方法解决实现Runnable接口的线程安全问题 * * 关于同步方法的总结: * 1. 同步方法仍然涉及到同步监视器,只是不需要我们显式的声明。 * 2. 非静态的同步方法,同步监视器是:this * 静态的同步方法,同步监视器是:当前类本身 * @author Rich…
这篇文章没有摘要
package top.qaqaq.java.P434; /** * @author RichieZhang * @create 2022-10-20 下午 10:32 */ /** * 使用同步代码块解决继承Thread类的方式的线程安全问题 * * 例子:创建三个窗口买票,总票数为100张. 使用继承Thread类的方式 * * 在继承Thre…
package top.qaqaq.java.P432; /** * 例子:创建三个窗口买票,总票数为100张. 使用实现Runnable接口的方式 * * 1.问题:卖票过程中,出现了重票、错票 -->出现了线程的安全问题 * 2.问题出现的原因:当某个线程操作车票的过程中,尚未操作完成时,其他线程参与进来,也操作车票。 * 3.如何解决:当一个…
线程的生命周期
Thread类中的常用的方法: * 测试Thread中的常用方法: * 1. start():启动当前线程; 调用当前线程的run() * 2. run(): 通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中 * 3. currentThread(): 静态方法,返回执行当前代码的线程 * 4. getName(): 获…
创建多线程的两种方式 说明两个问题: 问题一:我们启动一个线程,必须调用start(),不能调用run()的方式启动线程。 问题二:如果再启动一个线程,必须重新创建一个Thread子类的对象,调用此对象的start(). 两种方式的对比: * 开发中:优先选择:实现Runnable接口的方式 * 原因:1. 实现的方式没有类的单继承性的局限性 * …
程序、进程、线程的理解 进程可以细化为多个线程。 每个线程,拥有自己独立的:栈、程序计数器 多个线程,共享同一个进程中的结构:方法区、堆
1. 谈谈你对程序、进程、线程的理解 程序:是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。 进程:是程序的一次执行过程,或是正在运行的一个程序。 线程:进程可进一步细化为线程,是一个程序内部的一条执行路径。 2. 代码完成继承Thread的方式创建分线程,并遍历100以内的自然数 3. 代码完成实现Runnable…
package top.qaqaq.java.P425; /** * 例子:创建三个窗口买票,总票数为100张. 使用实现Runnable接口的方式 * * @author RichieZhang * @create 2022-10-20 下午 6:18 */ class Window1 implements Runnable{ private i…
package top.qaqaq.java.P424; /** * 创建多线程的方式二:实现Runnable接口 * 1. 创建一个实现了Runnable接口的类 * 2. 实现类去实现Runnable中的抽象方法:run() * 3. 创建实现类的对象 * 4. 将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象 * 5.…
package top.qaqaq.java.P423; /** * 例子:创建三个窗口买票,总票数为100张. 使用继承Thread类的方式 * * 存在线程的安全问题,待解决。 * * @author RichieZhang * @create 2022-10-20 下午 5:31 */ class window extends Thread{…
package top.qaqaq.java.P421; /** * 测试Thread中的常用方法: * 1. start():启动当前线程; 调用当前线程的run() * 2. run(): 通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中 * 3. currentThread(): 静态方法,返回执行当前代码的线程 …