一个类,有新增元素(add)和获取元素数量(size)方法。 启动两个线程。线程1向容器中新增数据。线程2监听容器元素数量,当容器元素数量为5时,线程2输出信息并终止

方式一:

/**
 * 两个线程要是可见的所以要加上votalile
 */public class Test_01 {
    public static void main(String[] args) {
        final Test_01_Container t = new Test_01_Container();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0; i < 10; i++){
                    System.out.println("add Object to Container " + i);
                    t.add(new Object());
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

        new Thread(new Runnable(){
            @Override
            public void run() {
                while(true){
                    if(t.size() == 5){
                        System.out.println("size = 5");
                        break;
                    }
                }
            }
        }).start();
    }
}

class Test_01_Container{
    volatile List<Object> container = new ArrayList<>();

    public void add(Object o){
        this.container.add(o);
    }

    public int size(){
        return this.container.size();
    }
}

方式二:

/**
 * wait notify
 */
package concurrent.t02;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class Test_02 {
    public static void main(String[] args) {
        final Test_02_Container t = new Test_02_Container();
        final Object lock = new Object();

        new Thread(new Runnable(){
            @Override
            public void run() {
                synchronized (lock) {
                    if(t.size() != 5){
                        try {
                            lock.wait(); // 线程进入等待队列。
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("size = 5");
                    lock.notifyAll(); // 唤醒其他等待线程
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    for(int i = 0; i < 10; i++){
                        System.out.println("add Object to Container " + i);
                        t.add(new Object());
                        if(t.size() == 5){
                            lock.notifyAll();
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        try {
                            TimeUnit.SECONDS.sleep(1);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }).start();
    }
}

class Test_02_Container{
    List<Object> container = new ArrayList<>();

    public void add(Object o){
        this.container.add(o);
    }

    public int size(){
        return this.container.size();
    }
}

方式三:

/**
 * CountDownLatch 门闩
 */
package concurrent.t02;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class Test_03 {
    public static void main(String[] args) {
        final Test_03_Container t = new Test_03_Container();
        final CountDownLatch latch = new CountDownLatch(1);

        new Thread(new Runnable(){
            @Override
            public void run() {
                if(t.size() != 5){
                    try {
                        latch.await(); // 等待门闩的开放。 不是进入等待队列
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("size = 5");
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0; i < 10; i++){
                    System.out.println("add Object to Container " + i);
                    t.add(new Object());
                    if(t.size() == 5){
                        latch.countDown(); // 门闩-1
                    }
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

class Test_03_Container{
    List<Object> container = new ArrayList<>();

    public void add(Object o){
        this.container.add(o);
    }

    public int size(){
        return this.container.size();
    }
}

原文地址:https://www.cnblogs.com/a103007/p/9827626.html

时间: 2024-07-28 21:03:40

一个类,有新增元素(add)和获取元素数量(size)方法。 启动两个线程。线程1向容器中新增数据。线程2监听容器元素数量,当容器元素数量为5时,线程2输出信息并终止的相关文章

EditText获取和失去焦点,软键盘的关闭,和软键盘的显示和隐藏的监听

软键盘显示和隐藏的监听: 注: mReplayRelativeLayout是EditText的父布局 //监听软键盘是否显示或隐藏 mReplayRelativeLayout.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); mRe

vue监听路由的变化,跳转到同一个页面时,Url改变但视图未重新加载问题

引入:https://q.cnblogs.com/q/88214/ 解决方法: 添加路由监听,路由改变时执行监听方法 methods:{ fetchData(){ console.log('路由发送变化doing...'); } }, created() { var self = this; self.fetchData(); }, watch:{ '$route':'fetchData' }, 原文地址:https://www.cnblogs.com/ilimengyang/p/9197797

编写2个接口:InterfaceA和InterfaceB;在接口InterfaceA中有个方法void printCapitalLetter();在接口InterfaceB中有个方法void printLowercaseLetter();然 后写一个类Print实现接口InterfaceA和InterfaceB,要求printCapitalLetter()方法 实现输出大写英文字母表的功能,pri

package com.homework1; public interface InterfaceA { //声明抽象方法 void printCapitalLetter(); } package com.homework1; public interface InterfaceB { //声明抽象方法 void printLowercaseLetter(); } package com.homework1; public class Print implements InterfaceA, I

移动端监听上滑下滑(判断元素是否滚动到底部)

touchUp(){             var startY = 0; let that = this;             document.addEventListener("touchstart",function(e){                 startY = e.changedTouches[0].pageY;             },false);             document.addEventListener("touchmo

js监听页面的scroll事件,当移到底部时触发事件

//页面拉到底时自动加载更多 $(window).scroll(function(event){ var wScrollY = window.scrollY; // 当前滚动条位置 var wInnerH = window.innerHeight; // 设备窗口的高度(不会变) var bScrollH = document.body.scrollHeight; // 滚动条总高度 if (wScrollY + wInnerH >= bScrollH) { showMore(); } });

iOS开发大招-使用运行时runtime方法给一个类添加属性

看过一些第三方开源类库的源代码,经常发现他们 给一个 类 添加了一个原本不存在的属性, 比如PPrealSideController 就给 UIViewController添加了一个 self.pprealSideController的属性? 他是如何实现的呢? 1.基本的实现思路 首先我们需要了解,实际上 在我们使用  类似于self.newProperty的语句的时候, 根据点语法的规则实际上是调用的  setNewProperty方法,和  newProperty方法, 那我们可以知道他肯

PIE SDK元素事件的监听

1功能简介 元素在操作的过程中,如添加,删除,选中等操作都需要有事件的监听,PIE SDK支持对元素操作事件的监听,下面对元素事件的监听进行介绍. 2功能实现说明 2.1.1 实现思路及原理说明 第一步 地图初始化进行窗体绑定,声明元素的监听事件 第二步 当触发监听事件时进行事件操作 2.1.2 核心接口与方法 接口/类 方法/属性 说明 IGraphicsContainer DeleteElement(IElement element) 删除指定元素 AddElement () 添加元素 Se

[Java聊天室server]实战之二 监听类

前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识,但学习之前,更想和广大程序猿分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比方近期在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序猿最好还是从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字...

[Java聊天室服务器]实战之二 监听类

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)