Java多线程

**多线程的优点:**提高应用程序的响应,对图形化界面更有意义;可增强用户体验;提高cpu的利用率;改善程序结构,将进程分为多个线程,独立运行;
创建多线程的方式:
1.创建一个继承于thread的子类,重写thread类的run()方法;将此线程执行的操作声明在run()方法中创建thread类的子类的对象,通过此对象调用start()方法(该方法启动当前线程,调用当前线程的run()方法;)
不能通过直接调用run()方法的方式启动线程;
currentThread()静态方法获取当前代码的线程;
getName()获取当前线程的名字,setName()设置名字
yeild()方法:释放当前cpu的执行权;
join()方法:线程A调用线程B的join()方法,此时线程a进入阻塞状态;知道线程b被执行完以后;线程a才继续执行;stop()强制结束当前线程;sleep()方法:表示让当前线程休息,强制阻塞指定的时间;
线程优先级:MAX_PRIORITY:10,最小,1,NORM_PROIORITY:5,默认优先级,高优先级抢占低优先级的cpu的执行权,但高优先级只是代表高优先级高概率被执行,并不意味着高优先级执行完低优先级才执行;
方法2.创建一个实现runnable()接口的类;实现类实现thread类的run()方法;创建thread类的子类的对象;通过此对象调用start()方法;(该方法调用了Runnable类型的target)
相同点:两种方式都需要重写run()方法,将线程要执行的逻辑声明在run()中;
开发中优先选择Runnable因为这种实现的方式更适合处理多个线程共享数据的方式;
程序:为完成特定任务,用某种语言编写的一组指令的集合,即一段静态的代码;
进程:是程序的一次执行过程,或是正在运行的一个程序,是一个动态的过程,有自身产生,存在和消亡的过程;线程:是调度和执行的基本单位;是程序内部的一条执行路径;
线程的生命周期: 新建 newThread(),,就绪 start(),运行 run(),获取cpu的执行权,阻塞,slepp(),join();等待同步锁,wait();从阻塞到就绪:sleep()方法执行完,joint()结束,获取同步锁,notify()或者notifyall();死亡执行完run()或者stop();
线程的安全问题:问题出现的原因;当某个线程操作车票的过程中,其他线程参与进来,也操作该共享数据;
如何解决?同步代码块或者是加锁;
synchronized(同步监视器){
//x需要被同步的代码
}
操作共享数据的代码,即为需要被同步的代码
**同步监视器:**锁;任何一个类的对象都可以充当锁;要求多个线程共用同一个锁;
操作同步代码块时只能有一个线程参与,其他线程等待,相当于是一个单线程的过程,效率低;
在实现runnable接口创建多线程的方式,可以考虑使用this充当同步监视器;
同步的好处解决了线程安全的问题,但坏处就是处理效率低,因为使用同步之后只能有当前进程可以运行,其他线程处于阻塞状态;
同步方法仍然涉及到同步监视器,只是不需要我们显示声明;非静态的同步方法,同步监视器:this;
静态的同步方法,同步监视器是当前类;
死锁问题:不同的线程都分别占用对方所需要的资源,造成死锁;
说明:1.出现死锁后不会异常,只是线程处于死锁状态;
解决线程安全的第三个方法:lock锁
reetrantlock lock= new reetrantlock();2.lock.lock()调用锁的方法3.调用解锁的方法
sychronized方式与reetrantlock的相同点与不同点;都可以解决线程安全的问题;sychronized()在执行完相应的同步代码之后,自动释放同步监视器;lock方式需要手动启动同步或者手动释放同步;
如何解决线程的安全问题:同步代码块,同步方法,以及最后的reetrantlock()
分析是否有线程安全问题:1.是否是多线程问题,2
是否共享数据;是否有线程安全问题,考虑如何解决线程安全问题;
线程的通信: wait():一旦执行此方法,当前线程进入阻塞状态,并释放监视器;notify():一旦执行此方法,就会执行被wait()的方法,就唤醒优先级高的那个;notifyall()唤醒所有的线程;
这三个方法只能出现在同步代码块或者同步方法中;
这三个方法的调用必须是同步代码块或同步方法中的同步监视器,否则会出现ILLEGALStateException异常;
这三个方法定义在java.lang.object类中;
面试题:sleep()和wait():相同点:一旦执行这个方法线程会被阻塞;不同点::1)两个方法的声明位置不同,thread类中声明sleep()方法,object类中声明wait()方法 (2)其次,调用的范围:sleep()方法可以在任何需要的场景下调用;wait()方法必须使用在同步代码块中或者同步方法中;关于是否释放同步监视;sleep()不会释放锁,而wait()方法 会释放监视器;
线程的创建方式新增方式1::使用callable接口,重写call(),可以有返回值,可以抛异常,支持泛型的返回值;方法可以抛出异常,支持泛型的返回值,需要借助
FutureTask
类,该类是实现future接口的唯一的实现类,比如获取返回结果;通过get()方法;get方法的返回值即为futuretask构造器参数callable实现类重写的call()的返回值;
a.创建一个实现callable类的实现类,实现call方法,将此线程需要执行的操作声明在call()方法中;同时,将callable接口实现类的对象作为构造器的参数传入到future接口的实现FutureTask对象;new thread类的对象,将futuretask实现future接口的对象作为其构造器的参数,这里是因为futuretask类同时也实现了runnable接口,调用start()方法,最后通过调用该对象的get()方法获取call()方法的返回值;
使用线程池的方式创建线程:提前创建好多个线程使用时直接获取,使用完放回到池中,实现重复利用;优点: 提高响应速度,降低资源消耗;便于线程管理
设置核心池的大小;最大线程数
**Executors:**工具类,用于返回不同值类型的线程池提供制定线程数量的线程池;执行指定的线程的操作;需要提供实现runnable接口或callable接口实现类的对象;最后关闭连接池;

voliate关键字:保证了变量的可见性(visibility)。被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象。
AbstractQueuedSynchronized(AQS):AQS定义了一套多线程访问共享资源的同步器框架
手掌之间的相似度,是怎样确保的;所以说整体,其实也就是说我的方法相比较于现有的方法有什么创新点;

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值