2020-03-13线程间通信

多线程通信:其实就是多个线程在操作同一个资源,但是操作的动作不同。需要对操作代码进行同步,而且要同一个锁(用类的字节码文件对象)。



某一时刻输入的执行权被抢走了,输出不交出执行权,结果一直在打印相同的结果。解决方法:

等待唤醒机制:加入Boolean标记和wait,第一个线程判断false操作数据后放弃执行资格(wait())并置true并等,唤醒(notify())另一线程,另一线程判断true获得执行权,执行完之后唤醒第一个线程,并置false。

等待的线程位于线程池

注意:wait、notify、notifyall全都需要对持有监视器(锁)的线程操作,也就是必须要在同步之中使用。

wait可能会有异常,需要try。这些方法调用时需要标识他们所操作的线程的锁,只有同一个锁上的被等待线程可以被同一个锁的notify唤醒,而不可以被不同锁的线程进行唤醒,而锁可以是任意对象,所以这类方法都定义在Object类下。

优化:将输入输出函数用同步封装到类中,而运行类直接调用类方法


生产者消费者:生产一消费一

如果多线程执行生产或消费,有可能是在等待的过程中生产者线程把另一个生产者唤醒,唤醒之后就不判断了,直接进入语句。导致生产了2次。问题在于醒来的时候没有判断,把if改成while,执行完wait之后就判断条件,但是这样会导致锁死(因为唤起同是生产者或消费者的线程时,会使它进入等待,而相对的线程执行完之后也可能把同类型线程等待,造成全体等待。与死锁有区别)。解决:将notify改成notifyAll

新版本之后同步被替代,使用lock对应多个condition对象,从而实现定向唤醒和睡眠


守护线程(后台线程)setDaemon:前台线程都结束后,后台线程会自动结束。


join

主线程等待该调用线程终止,用于临时加入线程运行。A线程执行到B线程的join方法时,A就会等待,释放执行权,现有未冻结的线程交替执行,等B都执行完A才会执行。注意join和start的位置有所区别


线程组:哪个线程开启的就在哪个线程组

优先级:抢资源的频率,默认是5.通过setPriority设置。Thread.MAX_PRIORITY

yield方法:暂停当前正在执行的线程对象,执行其他线程。可以降低线程执行频率,可以实现平均运行效果

可以使用匿名内部类实现简便的多线程:

new Thread(){

//复写run方法

    public void run(){}

}.start();

或者用Runnable子类,但是要创建对象并创建线程。


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 7,190评论 1 15
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 8,068评论 1 18
  • 一、进程和线程 进程 进程就是一个执行中的程序实例,每个进程都有自己独立的一块内存空间,一个进程中可以有多个线程。...
    阿敏其人阅读 7,395评论 0 13
  • 【threading模块详解】 模块基本方法 该模块定了的方法如下:threading.active_count(...
    奕剑听雨阅读 4,693评论 0 0
  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-java.h...
    eddy_wiki阅读 6,618评论 0 14