• 技术文章 >java >java基础

    线程在java中的通信

    小妮浅浅小妮浅浅2021-01-08 10:40:50原创2009

    基于多个线程一起运行时,会出现一些不必要的麻烦,这里我们可以应用线程通信的原理。即在程序运行之前,线程内部之间就沟通好下一步的任务情况,进行通信的合作。接下来我们简单分析线程通信的目的,然后主要就线程通信的几种方法为大家展示,都来看看有哪些吧。

    一、线程通信目的

    为了更好的协作,线程无论是交替式执行,还是接力式执行,都需要进行通信告知。

    二、线程通信方法

    1.join

    一个线程等待另一个线程执行完毕后再执行。join其实合理理解成是线程合并,当在一个线程调用另一个线程的join方法时,当前线程阻塞等待被调用join方法的线程执行完毕才能继续执行,所以join的好处能够保证线程的执行顺序,但是如果调用线程的join方法其实已经失去了并行的意义,虽然存在多个线程,但是本质上还是串行的,最后join的实现其实是基于等待通知机制的。

    2.wait/notify

    在一个线程内调用该线程锁对象的wait方法,线程将进入等待队列进行等待直到被通知或者被唤醒。

    3.CountdownLatch

    一个线程等待(countDownLatch.await())其他任意个数的线程执行完毕后(countDownLatch.countDown())再执行

    4.CyclicBarrier

    所有线程先各自准备,当所有线程都准备完毕(全部都调用了cyclicBarrier.await())后统一开始执行后续操作

    5.Semaphore

    可以控制同时访问的线程个数,通过acquire()获取一个许可,如果没有就等待,而release()释放一个许可

    6.Callable

    子线程将执行结果返回给父线程

    FutureTask<Integer> futureTask = new FutureTask<>(callable);
    new Thread(futureTask).start();
    Object result = futureTask.get();

    (1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同:

    (2)CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行;

    (3)CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;

    (4)另外,CountDownLatch是不能够重用的,而CyclicBarrier是可以重用的。

    (5)Semaphore其实和锁有点类似,它一般用于控制对某组资源的访问权限。

    以上就是线程在java中的通信方法,这里我们重点讲了Callable的处理方法,其他的方法做了原理上的介绍吗,想要深入了解可以在课后查询资料。

    专题推荐:java线程通信
    上一篇:java线程和进程的关系有哪些 下一篇:thread类在java线程中的使用

    相关文章推荐

    • java中线程是什么意思• java线程创建的几种方式• java线程的状态有哪些• java线程和进程的关系有哪些

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网