smile921 / smile921.github.io

http://smile921.github.io
0 stars 0 forks source link

CopyOnWriteArrayList 使用示例 #2

Closed smile921 closed 7 years ago

smile921 commented 7 years ago

关于 CopyOnWriteArrayList 需要仔细研究一番

smile921 commented 7 years ago

示例一


/**
 * 
 */
package horse.wtf.nzyme.concurrent;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author frere
 *
 */
public class CopyOnWriteArrayListDemo {

    public void run() {
        final int NUM =10;
        List<String> lst = new ArrayList<String>(NUM);
        lst = new CopyOnWriteArrayList<String>( );
        for(int i=0;i<NUM;i++) {
            lst.add(i, "main_"+i); 
        }
        ExecutorService es = Executors.newFixedThreadPool(4);
        for(int i=0;i<NUM;i++) {
            es.execute(new ReadListThread(lst));
            es.execute(new WriteListThread(lst, i)); 
        }
        es.shutdown();      
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new CopyOnWriteArrayListDemo().run();       
    }

    private static class ReadListThread implements Runnable {

        private List<String> lst ;

        public  ReadListThread(List<String> list) {
            this.lst = list;
        }

        @Override
        public void run() {
             for(String e : lst) {
                 System.out.print(e+",  ");
             }          
             System.out.println("");
        }

    }// class ReadListThread end

    private static class WriteListThread implements Runnable {
        private List<String> lst;
        int index;

        public WriteListThread(List<String> list,int index) {
            this.lst = list;
            this.index = index;
        }

        public void run() {
            this.lst.remove(index);
            this.lst.add(index, "write_"+index); 
        }
    }

}