Java多线程学习笔记 学习书本->黑马程序员java基础教程

**

Java多线程学习笔记 学习书本->黑马程序员java基础教程

大二个人学习多线程时的·笔记,如有错漏,请指正
地点:东校区图书馆四楼
作者:20人工智能2小青
时间:2021年10月24日
“”“祝大家程序员节快乐”“”
**

1.先创建一个继承Thread类的MyThread的Class,再让MyThread重写run()类的方法/主要是想要让它调用run()的函数时进行显示出调用的时候。
2.在刚开始创建的那个creatThreatClass函数里面进行函数的调用,相当于函数main的调用其他函数进行试验。
3,这里的多线程的意思是先进行运行完“MyThread类的run()方法在运行”五次那个线程的同时也在运行“我想要一些东西进行开始项”的线程五次,两个线程是分开同时进行执行,那个执行完再进行同步的执行。(个人理解)执行的图解如下:
在这里插入图片描述
在这里插入图片描述

调用结果:
在这里插入图片描述
注意:这里后执行了while语句

4.多线程之——Runnable接口
原因,因为当一个类继承一个父类,这样造成了它无法再继承新的父类,现在使用Runnable接口,让类可以继承多线程的同时也能继承一个父类。
思路:
1先创建一个main作用的主调用class函数,public class creatRunClass
2 后创建一个继承了Runnable接口的函数(那个继承是implements接口 的),在里面重写run()函数,[class MyThread2 implements Runnable]函数
3 回到main作用的函数,创建一个MyThread2类的对象,然后再创建一个MyThread2的对象myThread2,再把它放进Thread类创建的一个对象thread2的初始化里面。
4 使用thread2.start(),进行调用函数run()。
下面进行展示代码:
在这里插入图片描述

运行的结果展示:
在这里插入图片描述
注意:这里前执行了while语句

总结:前面两个继承对while的语句执行顺序不一样(但是都是在线程里面进行执行的)。

5两种方式的比较(Thread和Runnable之间的继承比较):使用一个窗口售票模拟两种方法的使用。
一、 先进行Thread的使用:

  1. 创建四个对象分别进行销售100张票,这四个线程是同时进行的多线程任务。(证明:编译结果)但是,这个销售的结果和现实我们需要的差异显著,这是一个进行对四个对象分别进行销售的东西。但是现实当中我们需要的结果是进行100张票分四个窗口进行销售,但是这一个创建四个对象却是四个窗口加起来销售了四百张票。
    代码图片:
    在这里插入图片描述

部分运行的结果:
在这里插入图片描述

6.使用解决上面这种情况的思路是:创建一个对象,但是为这个对象开创四个窗口,进行100张票让四个窗口进行操作。这里需要用到Runnable函数里面的捕捉一个进程的对象然后放在四个窗口里面进行执行。
1.思路,重写run(),等线程里面进行调用run(),重写的run()函数需要有Runnable接口的捕捉()和读写(),确认其中的函数是否已经进行了调用。
2.在main()里面创建一个对象,然后创建四个窗口进行线程的调用。
代码如下:
在这里插入图片描述
运行结果(部分):
在这里插入图片描述
这样就完成了100张票的分窗口多线程。

总结:Runnable接口比Thread父类的优点:

  1. 适合多个相同程序代码的线程去处理一个资源的情况,把线程同程序代码,数据有小分离,很好地体现了面向对象的设计思想.
  2. 可以避免由于java的单继承带来的局限性。在开发过程中,一个类不能同时继承两个类。当一个类继承了一个父类,这样就不能继承Thread类,这时就能使用Runnable接口进行实现多线程任务。

7.后台线程‘
通过在编译器上面进行运行的情况,在开始程序,到卖完票之后,程序还是没有结束完成,还在进行运行。如图下面:

原因:对于java来说,只要还有一个前台进程还没结束,仍然在执行售票的代码。解决的方式可以是进行使用java的setDacmon(true),这个线程就会变成一个后台线程。
在这里插入图片描述
上面的结果是和课本(黑马程序员Java教程)描述不一样的,是因为JDK的更新不一样吗.
运行结果如下(和课本的显示不一样):
在这里插入图片描述

8.线程的生命周期及状态转换
1.一个正常运行的程序,当它正常运行完毕或者在运行的过程当中抛出一个未捕获的异常或者错误的时候,线程的生命周期便会结束.
2.线程的各种状态如下:
在这里插入图片描述
3. 在程序的运行过程当中,部分操作对程序的运行进程的情况发生变化(操作图如下):

8.线程的调度.线程的优先级:
优先级分为1~10,程序在运行期间,处于就绪状态的线程都有自己的优先级,可以通过Thread类的setPriority(int newPriority)方法对线程的优先级进行设置,该方法中的参数newPriority接受的是1~10之间的整数或者Thread类的三个静态常量。
下面来演示一下不同优先级的两个线程在程序中的运行情况:
创建的思路:

  1. 写出一个类继承Runnable函数,写一个maxRunnable接口。再写出一个类继承Runnable接口,写一个minRunnable函数。
  2. 在主函数里面创建两个Thread对象,然后再创建两个对象并调用相应的方法, 把maxRunnable和minRunnable分别放在对象里面,然后再进行优先级的设置 。

代码如下图:
在这里插入图片描述
运行结果如下图:
在这里插入图片描述
经过上面的示例可以看出来,可以通过设置优先级的进行决定程序的运行优先情况。

9.线程休眠
意义:让一个程序进行休眠,让其他的程序运行。
使用sleep(long millis)方法让程序进行休眠,但是声明抛出InterruptedExpection异常,如果不写出来就会抛出错误,所以需要进行写出来。

  1. 创建一个SleepThread类继承Runnable接口,然后在里面创建线程的延迟的时间。
  2. 在xianChengXiuMs(main)的主函数里面可以创建一个对象,然后把这个对象放在Thread创建的新的对象里面。
  3. 最后调用函数,里面有线程开始执行,如何体会到这些线程的休眠呢,可以进行体验的是再调用的过程当中,可以进行看到屏幕里面函数执行然后弹出的语句是有时间限制慢慢进行弹出一句句的语句

代码如图:
在这里插入图片描述
运行结果:
在这里插入图片描述

10.线程让步
1.线程让步和线程休眠两者的感觉是差不多的,但是区别在于yield()方法不会阻碍该线程,它只是将线程改变成就绪状态,让系统的调度器重新调度器重新调度一次。
当某个线程调用yield()方法之后,只有与当前线程优先级相同或者更高才能获得执行的机会。
3. 创建的思路:
创建继承Thread的一个让步的类.
在主函数里面创建两个对象进行调用
设置i==3 的时候进行两个线程让步的开始操作
//最后是B让给A执行,但是A又让给B执行了,然后B执行完再让给A进行执行

代码如下:
在这里插入图片描述

执行结果:
在这里插入图片描述

11.线程插队
1.原理:当在某个线程当中调用其他线程的join()方法时,调用了代码join()方法的线程将被阻碍,直到被join()方法加入的线程执行完它才会继续运行。(通俗来说就是当一个线程B开始执行之后,然后在线程B里面进行对线程A的调用,然后线程B就会被阻碍运行,这时进行对线程A的调用,当线程A运行完之后才会对线程B进行执行)
2.设计思路:先创建一个class继承Runnable的run()方法,然后在那里创建sleep休眠时间,最后创建main函数里面的对象,调用,让main函数进行运行,然后再让t对象进行运行,最后在main函数的流程运行里面调用t.join()让t对象进行插队(需要main的同意,就是在main里面进行调用t.join()),这样就让t进程先进行运行,等t
进程运行完成之后再进行main()进程运行直到结束。
代码如下:
在这里插入图片描述

代码实现结果(因为代码里面的设计休眠时间比较长,请耐心等待。。。):

在这里插入图片描述

12.线程安全
当线程在运行的过程当中会出现“意外”,例如把票数打印出了出了负数。举个例子就是当我要销售10张机票,我开了四个窗对机票进行销售(对创建的一个对象使用了四个线程进行运行)。可是,我在对象的class里面设置了一个线程休眠,这个休眠在if判断语句的管辖范围里面。然后四个线程进行运行,然后,当第一个窗口买票只剩下一张票的时候,先进行if语句的判断,符合票数大于零就能进行下一步的语句执行,然后第一个窗口进行了线程休眠语句的调用,进行了休眠。然后第二个窗户口开始,先进行if语句的判断,符合票数大于零就能进行下一步的语句执行(因为窗口一休眠还没把票卖出去,这是共用的票数还是只有一张)。窗口三和窗口四也是按照这样的步骤进行,然后进入了休眠的状态,最后,线程一苏醒,开始执行,这时总票数被窗口一卖出一张,变成了0,但是这是线程二也开始进行执行,但是这时总票数是0,这也没办法呀,硬着头皮也要执行下去的嘛,所以这次执行让总票数变成-1,以此类推,最后售卖的飞机票数为负数。
代码图片:
在这里插入图片描述
运行结果:
在这里插入图片描述

因为只是自己在学习过程当中的笔记,在书写的过程当中难免有一些错漏之处,请多多包涵,请大神们指出.
上面的代码图片可能有点迷糊,下面我上传一下代码图片:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值