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子类,但是要创建对象并创建线程。


你可能感兴趣的:(2020-03-13线程间通信)