黑马程序员_多线程

本文详细介绍了Java中创建和管理多线程的两种主要方法:通过继承Thread类和实现Runnable接口。此外,还讨论了线程的状态、常用方法如wait(), notify(), notifyAll()的正确使用场景,以及如何通过join方法控制线程执行顺序。

javaEE+android培训


多线程
    创建线程的一种方法:
        1.定义类继承Thread
        2.覆写Thread类中的run方法
            目的:将自定义打你吗存储在run方法中,让线程运行
        3.调用线程的start方法
            作用:启动线程,调用run方法
        4.线程的5中状态,见图
        5.Thread中几个方法:
            static Thread currentThread();获取当前线程对象
            getName();获取线程名称
            设置线程名称:serName或者构造函数
    创建线程的第二种方法:
        1.定义类实现Runnable接口
        2.覆盖Runable接口中的run方法
            将线程要运行的代码存放在该run方法中
        3.通过Thread类建立Thread类对象
        4。将Runnable接口的子类对象作为实际参数传给Thread类的构造参数
            原因:自定义的run方法所属的对象是Runnable接口的子类对象,所以要让线程去指定对象的run方法,就必须明确该run方法所属对象
        5.调用Thread类的start方法开启线程并调用Runnable接口子类的run方法
    两者的区别
        Runanble好处:避免了单继承的局限性(在建立时建议用Runnable实现)
        继承Thread:线程代码存放在Thread子类run方法中
        实现Runnable:线程代码存放在接口的子类run方法中
    静态同步的方法:使用的所示该方法所在类的字节码文件对象
    wait(),notify(),notifyAll()都使用在同步中,因为要对持有监视器(锁)的线程操作,所以要使用在同步中,因为只有同步才具有锁
    这些操作线程的方法要定义在Object中:因为这些方法在操作同步中线程是,都必须要标识他们所操作线程只有的锁,不可以对不同锁中的线程进行唤醒
    在线程中为了能够唤醒对方线程而不唤醒本方线程引入了新的特性:
        将同步Synchronized替换成lock操作,(因为lock上支持多个对象)
        将object中的wait,notify,notifyAll,替换成了Condition对象
        该对象可以Lock锁,进行获取
    线程停止的方法:
        控制住循环,让run方法结束,也就是线程结束
        特殊情况:
            当线程处于了冻结状态,就不会读取到标记,那么线程就不会结束,这时需要对冻结进行清除,强制线程恢复到运行状态中来,这样就可一操作标记让线程结束
    join:
        join可以用来临时加入线程执行



提供的引用中未包含黑马程序员提供的多线程相关题目,但可以基于引用中的多线程概念生成一些相关题目。 ### 概念理解类 - 解释多线程的概念,说明其本质和执行效果。 - 阐述多线程技术在减少程序等待时间方面的原理。 ### 代码分析类 ```java public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } ``` - 分析上述可缓存线程池代码,解释核心线程数、最大线程数和阻塞队列的特点。 - 说明`SynchronousQueue`作为阻塞队列对线程池的影响。 ### 代码编写类 参考以下代码: ```java package exercise6itcast; import java.util.ArrayList; import java.util.Collections; public class Main { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(); Collections.addAll(list, 100, 300, 2, 800, 50, 700, 200, 10, 5, 80, 20, 500); MyThread t1 = new MyThread(list); MyThread t2 = new MyThread(list); t1.setName("抽奖箱1"); t2.setName("抽奖箱2"); t1.start(); t2.start(); } } ``` - 实现`MyThread`类,模拟抽奖箱多线程抽奖过程。 - 若要添加更多抽奖箱线程,如何修改代码。 ### 方法应用类 ```java public final void setDaemon(boolean on) ``` - 编写代码示例,展示`setDaemon`方法的使用,并说明后台线程和前台线程在结束时的区别。 - 解释为什么`setDaemon`方法必须在启动线程前调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值