ava 同步-Java 多线程同步工具 CyclicBarrier

问题描述

Java 多线程同步工具 CyclicBarrier

Java中使用CyclicBarrier控制多个线程在执行完后,才执行后续操作,请大家帮我分析下,项目两个代码中为什么执行结果不一样:
代码1、
public class CyclicBarrierTest2 {

public static void main(String[] args) throws InterruptedException, BrokenBarrierException {
    final CyclicBarrier cb = new CyclicBarrier(2, new Runnable() { // 等到线程到达后执行一个后续task
        @Override
        public void run() {
            System.out.println("这个是最后执行吗????" + Thread.currentThread().getName() + "    a");
        }
    });

    for(int i=0; i<2; i++){
        Thread r = new Thread(new Runnable() {

            @Override
            public void run() {

                try {
                    cb.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println("1   " + Thread.currentThread().getName() + "   a");
            }
        });

        r.start();
    }

}

}

执行结果:
这个是最后执行吗????Thread-0    a

1 Thread-1 a
1 Thread-0 a

代码2:
public class RaceConditionWithCyclicBarrier implements Callable {
static CyclicBarrier cb = null;

RaceConditionWithCyclicBarrier() {
}

/**
 * @param args
 * @throws Throwable
 */
public static void main(String[] args) throws Throwable {
    ArrayList<Callable<Boolean>> listCall = new ArrayList<Callable<Boolean>>();

    ExecutorService executor = Executors.newFixedThreadPool(2); // 必须是allThread的个数

    //for(int i=0;i <1000; i++){

        listCall.clear();

        cb = new CyclicBarrier(2, new Runnable() { // 等到线程到达后执行一个后续task
                    @Override
                    public void run() {
                        System.out.println(Thread.currentThread().getName() + "a");
                    }
                });

        listCall.add(new RaceConditionWithCyclicBarrier());
        listCall.add(new RaceConditionWithCyclicBarrier());

        try {
            executor.invokeAll(listCall);

        } catch (Throwable e) {
            executor.shutdown();
            throw e;
        } finally {
            System.out.println( "    over");
        }

    //}

    executor.shutdown();

    // 这句是在所有线程都跑完之后才会执行
    System.out.println("是最后吗     ");
}

@Override
public Boolean call() throws Exception {
    for (int i = 0; i < 5; i++)
        System.err.println("=============================== " + i);
    cb.await();
    return true;
}

}

执行结果:
=============================== 0
=============================== 1
=============================== 2
=============================== 3
=============================== 4
=============================== 0
=============================== 1
pool-1-thread-2a
=============================== 2
=============================== 3
=============================== 4
over
是最后吗

请高手帮我看下,为什么两个执行结果 中“是最后吗”不一样,在代码1中是开始就执行了,代码2中是最后执行的

解决方案

可能是因为你的线程之间没有做到线程安全 arrylist就是线程不安全的 有的地方需要使用同步代码块 sychnolysed(我拼的不对 )你去查一下 你的线程之间同步没做好控制 去我博客里看看也行

时间: 2024-12-14 08:49:47

ava 同步-Java 多线程同步工具 CyclicBarrier的相关文章

Java多线程同步问题的探究(一、线程的先来后到)

众所周知,在Java多线程编程中,一个非常重要的方面就是线程的同步问题. 关于线程的同步,一般有以下解决方法: 1. 在需要同步的方法的方法签名中加入synchronized关键字. 2. 使用synchronized块对需要进行同步的代码段进行同步. 3. 使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象. 另外,为了解决多个线程对同一变量进行访问时可能发生的安全性问题,我们不仅可以采用同步机制,更可以通过JDK 1.2中加入的 ThreadLocal

java多线程同步问题,小弟百撕不得其解,特来求助!

问题描述 java多线程同步问题,小弟百撕不得其解,特来求助! 多线程共享同一资源,同一张票卖出了多张!同步方法,同步代码块都没用. 问题:编写三各类Ticket.SealWindow.TicketSealCenter分别代表票信息.售票窗口.售票中心.售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程. public class ThreadDemo { public static void main(String[] args) { Thread t1

java多线程同步的问题

问题描述 java多线程同步的问题 小测试,如何实现变量ticket的同步 private int ticket = 100; public void run() { while(ticket > 0 ) { System.out.println(ticket+" is saled by "+ Thread.currentThread().getName()); ticket--; try { Thread.sleep(200); } catch (InterruptedExce

java多线程-同步块实例讲解_java

java多线程-同步块 Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java 同步块用来避免竞争.本文介绍以下内容: Java 同步关键字(synchronzied) 实例方法同步 静态方法同步 实例方法中同步块 静态方法中同步块 Java 同步示例 Java 同步关键字(synchronized) Java 中的同步块用 synchronized 标记.同步块在 Java 中是同步在某个对象上.所有同步在一个对象上的同步块在同时只能被一个线程进入并执

Java多线程同步中的两个特殊类

Java语言内置了synchronized关键字用于对多线程进行同步,大大方便了Java中多线程程序的编写.但是仅仅使用synchronized关键字还不能满足对多线程进行同步的所有需要.大家知道,synchronized仅仅能够对方法或者代码块进行同步,如果我们一个应用需要跨越多个方法进行同步,synchroinzed就不能胜任了.在C++中有很多同步机制,比如信号量.互斥体.临届区等.在Java中也可以在synchronized语言特性的基础上,在更高层次构建这样的同步工具,以方便我们的使用

Java多线程同步问题的探究(三、Lock来了,大家都让开【1.认识重入锁】)

在上一节中,我们已经了解了Java多线程编程中常用的关键字synchronized,以及与之相关的对象锁机制.这一节中,让我们一起来认 识JDK 5中新引入的并发框架中的锁机制. 我想很多购买了<Java程序员面试宝典>之类图书的朋友一定对下面这个面试题感到非常熟悉: 问:请对比synchronized与java.util.concurrent.locks.Lock 的异同. 答案:主要相同点:Lock能完成synchronized所实现的所有功能 主要不同点:Lock有比synchroniz

Java多线程同步问题的探究(二、给我一把锁,我能创造一个规矩)

在上一篇中,我们讲到了多线程是如何处理共享资源的,以及保证他们对资源进行互斥访问所依赖的重要机制:对象锁. 本篇中,我们来看一看传统的同步实现方式以及这背后的原理. 很多人都知道,在Java多线程编程中,有一个重要的关键字,synchronized.但是很多人看到这个东西会感到困惑:"都说同步机制是 通过对象锁来实现的,但是这么一个关键字,我也看不出来Java程序锁住了哪个对象阿?" 没错,我一开始也是对这个问题感到困惑和不解.不过还好,我们有下面的这个例程: 1 public cla

Java多线程--同步与死锁:synchronized;等待与唤醒:wait、notify、notifyAll;生命周期

1.问题的引出 class MyThread implements Runnable{ private int ticket = 5 ; // 假设一共有5张票 public void run(){ for(int i=0;i<100;i++){ if(ticket>0){ // 还有票 try{ Thread.sleep(300) ; // 加入延迟 }catch(InterruptedException e){ e.printStackTrace() ; } System.out.prin

数据同步-java多线程数据库同步问题

问题描述 java多线程数据库同步问题 从一个数据库抽取数据 放到自己数据库里面 中间回走数据处理 和判断 用java代码实现目前找到好的方法 多线程操作效率还是很低 一点思路没有 有这方面大神吗 解决方案 可以利用数据库之间的同步来做呀!简单又实用 http://jingyan.baidu.com/article/19192ad815ad0ee53e5707c9.html