java 开启多线程 里面如何加条件判断执行其他逻辑?

sfasdfasdfasf 发布于 02/04 16:58
阅读 364
收藏 0

我写个全局变量写个AtomicInteger初始化为2,主线程返回不等待,然后开两个线程,每个线程执行时 AtomicInteger减1,在每个线程里面加个if判断,如果AtomicInteger对象为0时,执行某个逻辑。但是有的时候会执行两次,有的时候一次也不执行,该如何修改呢?

加载中
0
喜之郎
喜之郎

把线程的整个方法用synchronized同步一下。你可以这样想, AtomicInteger相当于一个带门锁的坑位,它能保证同一时刻只有一个人在里面蹲坑。你现在是看到门锁变绿色就允许敲一下坑位的门,当然无法保证两个排队的人同时敲门。所以你一进来厕所要把整个厕所大门给锁上,这样才能保证同一时刻只有一个人敲一个坑位的门。

0
shore
shore

public class TestCount {

    CountDownLatch count;  
    /**
     * @param args
     */
    public static void main(String[] args) {
        
        TestCount tc = new TestCount(2);
        Thread th1 = new Thread(new Runnable() {
            
            @Override
            public void run() {
                tc.getCount().countDown();
                if(tc.getCount().getCount() == 0) {
                    tc.printstr();
                }
            }
        });
        th1.start();
        
        Thread th2 = new Thread(new Runnable() {
            
            @Override
            public void run() {
                tc.getCount().countDown();
                if(tc.getCount().getCount() == 0) {
                    tc.printstr();
                }
            }
        });
        th2.start();

    }
    
    public TestCount(Integer count) {
        this.count = new CountDownLatch(count);
    }
    
    public void printstr() {
        System.out.println("end");
    }
    public CountDownLatch getCount() {
        return count;
    }
    public void setCount(CountDownLatch count) {
        this.count = count;
    }

}

sfasdfasdfasf
sfasdfasdfasf
这个我试过 tc.getCount().countDown();可能两个线程同时执行完,然后两个线程拿到的count都为零,那么 tc.printstr();就执行两次了
0
Cobbage
Cobbage

你为什么要放到两个线程中,单独抽出来不行吗?

CountDownLatch  awit

0
jzdayz
jzdayz
public static void main(String[] args) throws InterruptedException {
  CountDownLatch cdl =new CountDownLatch(2);

  AtomicInteger i = new AtomicInteger(2);
  Thread t1 = new Thread(() -> {
    int i1 = i.decrementAndGet();
    if (i1== 0){
      System.out.println("DONE");
    }
    cdl.countDown();
  });

  Thread t2 = new Thread(() -> {
    int i1 = i.decrementAndGet();
    if (i1== 0){
      System.out.println("DONE");
    }
    cdl.countDown();
  });


  t1.start();
  t2.start();
  cdl.await();
  System.out.println("END");

}

- 忽略countDownlatch

不会飞的小龙人
不会飞的小龙人
可行,AtomicInteger具有原子性操作,在多线程下数据是安全的;
小伯恩
小伯恩
你这个应该是最优的答案,用了同步的int和门闩
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部