跳至主要內容
CountDownLatch的使用

实现一个容器,提供get和size两个方法,些两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数大于5时,线程2给出提示并结束

接着这个问题,上一篇笔记的实现方法是用synchronized、wait和notify实现的,这种实现方式比较重,当不涉及同步,只是涉及线程通信的时候,那有没有更好的实现方法呢?(这不是废话吗)

CountDownLatch

CountDownLatch是一个非常实用的多线程控制的工具。常用的几个方法:

//实例化一个倒数器,count是指定计数个数
CountDownLatch(int count)
// 当count不等于0时,一直阻塞
void await()
// count - 1  操作
void countDown()

DHB大约 1 分钟Java线程
Thread的wait和notify

当不同线程之间需要通信时,就要使用到wait和notify这两个方法

wait的作用

让线程进入阻塞状态,并且会释放线程占有的锁,并交出CPU执行权限。

nofity

唤醒等待队列中的某个线程,如果时多个线程同时等待并不能指定唤醒某个线程,这有CPU来决定

notifyAll

这个方法则是唤醒等待队列中的所有线程

实践

实现一个容器,提供get和size两个方法,些两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数大于5时,线程2给出提示并结束


DHB大约 2 分钟Java线程
一个线程问题的记录

在线程中使用标识变量作为终止条件,可能导致无法结束

不阻塞

/**
 * @author donghaibin
 */
public class ThreadDemo {

    private static boolean running = true;

    public static void main(String[] args) throws InterruptedException {
        newThread();
        running = false;
    }

    private static void newThread() {
        Thread thread = new Thread() {
            @Override
            public void run() {
                while (running) {
                    
                }
            }
        };
        thread.start();
    }
}

DHB大约 2 分钟Java线程
如何优雅地停止Thread

作者:大闲人柴毛毛

interrupted()是Java提供的一种中断机制,要把中断搞清楚,还是得先系统性了解下什么是中断机制。

什么是中断?

在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制——中断。

  • 中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的interrupted方法,该方法也仅仅是将线程对象的中断标识设成true;接着你需要自己写代码不断地检测当前线程的标识位;如果为true,表示别的线程要求这条线程中断,此时究竟该做什么需要你自己写代码实现。
  • 每个线程对象中都有一个标识,用于表示线程是否被中断;该标识位为true表示中断,为false表示未中断;
  • 通过调用线程对象的interrupt方法将该线程的标识位设为true;可以在别的线程中调用,也可以在自己的线程中调用。

DHB大约 5 分钟Java线程