代码之家  ›  专栏  ›  技术社区  ›  Novice User

在CompletableFuture中多次运行Runnable

  •  3
  • Novice User  · 技术社区  · 6 年前

    我要执行多个线程,这些线程将尝试同时添加到我的自定义列表中 MyList

        public static void main(String[] args) {
    
            MyList<String> list = new list<String>();
    
            MyRunner<String> myRunner = new MyRunner<String>(list);
    
            ExecutorService threadPool = Executors.newFixedThreadPool(4);
    
            for(int i = 0; i < 20; i++) {
                CompletableFuture.runAsync(new MyRunner<String>(list));
            }
    
            try {
                threadPool.awaitTermination(100l, TimeUnit.SECONDS);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            System.out.println(list.getCount());
    }
    

    跑步者等级:

    class MyRunner<String> implements Runnable {
    
        MyList<String> list;
    
        public MyRunner(MyList <String> t) {
            this.list = t;
        }
    
        @Override
        public void run() {
            for(int i = 0; i < 200; i++) {
                list((String) (i + Thread.currentThread().getName()));
            }
    
        }
    }
    

    MyList类:

    public class MyList<T> {
    
        Queue<T> blockingQueue;
        Lock lock;
    
        long count;
    
        public MyList() {
            blockingQueue = new LinkedList<>();
            count = 0;
            lock = new ReentrantLock();
        }
    
        public void add(T singleTon) {
            lock.lock();
            blockingQueue.offer(singleTon);
            count +=1;
            lock.unlock();
        }
    
        public long getCount() {
            return count;
        }
    
    
    }
    

    后续问题:

    使用 CountDownLatch In runnable: 9 : pool-1-thread-1

    倒计时锁 实施:

    public static void main(String[] args) throws InterruptedException {
    
            MyList<String> mylist = new MyList<>();
    
            CountDownLatch latch = new CountDownLatch(10);
    
            ExecutorService executorService = Executors.newFixedThreadPool(4);
    
    
            for(int i = 0; i < 1000; i++) {
                CompletableFuture.runAsync(new MyRunner<String>(mylist, latch), executorService);
            }
    
            latch.await();
    
            System.out.println(mylist.count);
        }
    
    
    class MyRunner<String> implements Runnable {
    
        MyList<String> mylist;
        CountDownLatch latch;
    
        public MyRunner(MyList<String> mylist, CountDownLatch latch) {
           this.latch = latch;
           this.mylist = mylist;
        }
    
        @Override
        public void run() {
            for(int i = 0; i < 10; i++) {
                System.out.println("In runnable: "+ i + " : "+ Thread.currentThread().getName());
                mylist.add((String)("" + i));
            }
    
            latch.countDown();
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  7
  •   davidxxx    6 年前

    你调用 CompletableFuture.runAsync(Runnable runnable) 它不使用 Executor 改用 CompletableFuture.runAsync(Runnable runnable, Executor executor) 通过你的 执行人 例如:

    CompletableFuture.runAsync(new MyRunner<String>(list), threadPool);