JAVA_线程

==>线程的创建方式(继承Thread类与实现Runnable接口):

Thread类:
Thread类中的常用方法包括start()方法、interrupt()方法、join()方法、run()方法等。

其中start()方法与run()方法最为常用,start()方法用于启动线程,run()方法为线程实现功能的方法,可以根据需求覆写run()方法。
Thread类的构造函数有8个,但常用的只有4个,分别为:

Thread thread=new Thread();                                               //无参的Thread类构造函数
Thread thread=new Thread(Runnable simple);                        //参数为实现Runnable接口类对象的构造函数
Thread thread=new Thread("ThreadName");                                       //参数为线程名称的构造函数
Thread thread=new Thread(Runnable simple,"ThreadName");

thread:Thread类实例化对象。
simple:实现Runnable接口的类实例化对象。
ThreadName:线程名称。

Runnable接口:
只有实现Runnable接口的类实例化的对象才可以称为线程,Thread类就是因为实现了Runnable接口所以才具有了线程的功能。
Runnable接口只有一个方法就是run()方法,实现Runnable()接口后必须覆写run()方法。

==>两种创建线程方式的比较:

实现Runnble接口的优缺点分别如下:
从面向对象的角度来看,Thread类是一个虚拟处理机严格的封装,因此只有当处理机模型修改或扩展时,才应该继承该类。
由于Java 技术只允许单一继承,所以如果已经继承了Thread类,就不能再继承其他任何类,这会使用户只能采用实现Runnable接口的方式创建线程。

继承Thread类的优缺点分别如下:
当一个run()方法体现在继承Thread的类中,用this指向实际控制运行的Thread实例,因此,代码不再需要使用如下控制:Thread.currenThread().sleep(),而可以简单地使用:Thread.sleep()。继承Thread类方式使代码变的简单易读。

==>生命周期:

线程的4个主要周期状态是“创建”、“可执行”、“非可执行”和“消亡”,状态间的关系如图所示:
在这里插入图片描述

  • 创建
    当实例化一个Thread对象并执行start()方法后,线程进入“可执行”状态,开始执行,虽然多线程给用户一种同时执行的假象,但事实上在同一时间点上,只有一个线程在执行,只是线程之间转换的动作很快,所以看起来如同时执行一样。
  • 可执行
    当线程启用start()方法后,进入“可执行”状态,执行用户覆写的run()方法。当一个线程进入“可执行”状态下,并不代表它可以一直执行到run()结束为止,事实上它只是加入此应用程序执行安排的队列中,正如前文中提到的,这个线程加入了这个进程的线程执行队列中,对于大多数计算机而言,只有一个处理器,无法使多个线程同时执行,这时需要合理安排线程执行计划,让那些处于“可执行”状态下的线程合理分享CPU资源。所以,一个处在“可执行”状态下的线程,实际上可能正在等待取得CPU时间,也就是等候执行权,在何时给予线程执行权,则由Java虚拟机决定,同时也由线程的优先级来决定。
  • 非可执行
    在“可执行”状态下,线程可能被执行完毕,也可能没有执行完毕,处于等待执行权的队列中,当使线程离开“可执行”状态下的等待队列时,线程进入“非可执行”状态。可以使用Thread类中的wait()、sleep()方法使线程进入“非可执行”状态。
    当线程进入“非可执行”状态下,CPU不分配时间片给这个线程,若希望线程回到“可执行”状态时,可以使用notify()方法、notifyAll()方法以及interrupt()方法。
  • 消亡
    当run()方法执行完毕后,线程自动消亡,当Thread类调用start()方法时,Java虚拟机自动调用它的run()方法,而当run()方法结束时,该Thread会自动终止。以前Thread类中存在一个停止线程的方法stop(),不过现在废弃了,因为调用这个方法,很容易使程序进入不稳定状态。

==>多线程产生死锁

因为线程可以阻塞,并且具有同步控制机制可以防止其他线程在锁还没有释放的情况下访问这个对象,这时就产生了矛盾。比如:线程A在等待线程B,而线程B又在等待线程A,这样就造成了死锁。
一般造成死锁必须同时满足如下4个条件:

  • 互斥条件
    线程使用的资源必须至少有一个是不能共享的。
  • 请求与保持条件
    至少有一个线程必须持有一个资源并且正在等待获取一个当前被其他线程持有的资源。
  • 非剥夺条件
    分配的资源不能从相应的线程中被强制剥夺。
  • 循环等待条件
    第一个线程等待其他线程,后者又在等待第一个线程。

因为要发生死锁,这4个条件必须同时满足,所以要防止死锁的话,只需要破坏其中一个条件即可。

==>Java中交互方式分为同步和异步两种,异同情况如下:

同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;
异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。 区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值