作者微信 bishe2022

代码功能演示视频在页面下方,请先观看;如需定制开发,联系页面右侧客服
java多线程之并发集合ArrayBlockingQueue

Custom Tab

例子1 证明ArrayList是线程不安全的

我们开启100个线程.每个线程向List100个数据,那么当所有线程执行完成之后应该是10000条,然后就对比一下结果,看看是否为10000条.

public class Demo1 {
    public static void main(String[] args) throws InterruptedException {
        List<String> list = new ArrayList<>();
        Thread[] threads = new Thread[100];        for (int i = 0; i < threads.length; i ++){
            threads[i] = new Thread(() -> {                for (int j = 0;j < 100; j ++){
                    list.add(Thread.currentThread().getName() + ":" + j);
                }
            });
            threads[i].start();
        }        for (Thread thread : threads){
            thread.join();
        }

        System.out.println(list.size());
    }
}
thread.join(); 是让主线程等待所有的子线程执行完,才执行接下来的语句

运行结果为9979,而且每次运行结果还不一定是这个数.

当然,我们可以通过学过的知识,在执行list.add是给它加锁,比如将list.add(Thread.currentThread().getName() + ":" + j);改为synchronized (list){list.add(Thread.currentThread().getName() + ":" + j);}这样就能保证线程同步了.

可直接用于并发的集合类

其实java中已经提供了可直接用于并发的集合类,它们可以在多线程中进行CURD1操作,而且不需要程序员手动加locksynchronized来保证同步.一般来说,它们分以下两种:

这节课我将重点讲ArrayBlockingQueue,首先先看一下ArrayBlockingQueue的api,以及区分这些的差别

例子

之前我们写过山治和路飞的故事,在(十二)java多线程之Exchanger的例子中,其实山治和路飞是一个简单的生产者-消费者模式,只是山治和路飞都要等对方吃完或做完一个才能继续下一个.现在路飞想出另一个办法,在厨房和餐桌之间弄一个传送带,山治把食物做好之后,直接放传送带上,路飞就直接从传送带拿食物.传送带最多只能放10个食物.ok,开始编码..

public class LuFeiRunnable implements Runnable{
    ArrayBlockingQueue<String> queue;
    Random random = new Random();    public LuFeiRunnable(ArrayBlockingQueue<String> queue) {        
this.queue = queue;
    }    @Override
    public void run() {        while (true){            try {
                String take = queue.take();
                System.out.println("-->路飞拿到 " + take);
                Thread.sleep(random.nextInt(500));
                System.out.println("-->路飞吃完 " + take);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class ShanZhiRunnable implements Runnable{
    ArrayBlockingQueue<String> queue;
    Random random = new Random();    public ShanZhiRunnable(ArrayBlockingQueue<String> queue) {        
this.queue = queue;
    }    @Override
    public void run() {        while (true){            try {
                String food = Food.getRandomFood();
                System.out.println("==>山治开始做 " + food);
                Thread.sleep(random.nextInt(500));
                System.out.println("==>山治做好了 " + food);
                queue.put(food);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

Home