线城池

package chapter5;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
 
import javax.swing.plaf.ListUI;
 
/**
 * 除了 new Thread() 之外所有都是阻塞方法
 * @author fenglei.ma 2018/01/15
 */
public class FutureTaskMain {
 
    /**
     *  FutureTask 单任务  方式一
     */
    public static void main1(String args[]) throws Exception {
//      Executors.newCachedThreadPool()
        ExecutorService executorService = Executors.newFixedThreadPool(1);
 
        // 构造FutureTask
        FutureTask<String> futureTask = new FutureTask<String>(new RealData2("a"));
 
        executorService.submit(futureTask);
 
        System.out.println("请求完毕");
 
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
 
        // 取得call()方法的返回值 如果此时get方法没有执行完成,则依然会等待
        System.out.println("数据=" + futureTask.get());
        System.out.println("执行完了");
 
        executorService.shutdown();
    }
     
    /**
     * FutureTask submit 多任务  方式二
     */
    public static void main2(String args[]) throws Exception {
        long starttime = System.currentTimeMillis();
        Integer total_task = 0;
        ExecutorService executorService = Executors.newFixedThreadPool(10);
         
        List<FutureTask<String>> list = new ArrayList<FutureTask<String> >();
        for(int i=1; i<6 ;i++){
            FutureTask<String> futureTask = new FutureTask<String>(new RealData2("a"+i));
            executorService.submit(futureTask);
             
            list.add(futureTask);
            total_task ++;
        }
 
        System.out.println("请求完毕");
 
        TimeUnit.MILLISECONDS.sleep(2);
 
        for(int i=0 ;i<total_task;i++){
            // 取得call()方法的返回值 如果此时get方法没有执行完成,则依然会等待,知道所有都返回结果
            System.out.println("数据=" +  list.get(i).get());
        }
         
        System.out.println("执行完了");
 
        executorService.shutdown();
        long endtime = System.currentTimeMillis();
        System.out.println("-------执行时间------ " + (endtime-starttime)/1000  + " 秒");
    }
    ------------------------------------------------------------------   
    /**
     *  Future  invokeAll  方式一
     */
    public static void main3(String[] args) throws Exception{
        long starttime = System.currentTimeMillis();
        ExecutorService executor = Executors.newFixedThreadPool(1);
         
        List<RealData2> list = new ArrayList<RealData2>();
        for(int i=1; i<6 ;i++){
            list.add(new RealData2("a"+i));
        }
         
        System.out.println("请求完毕");
         
        List<Future<String>> invok = executor.invokeAll(list);
         
        for(Future<String> one :invok){
            // 取得call()方法的返回值 如果此时get方法没有执行完成,则依然会等待,知道所有都返回结果
            System.out.println("数据=" +  one.get());
        }
        System.out.println("执行完了");
        executor.shutdown();
         
        long endtime = System.currentTimeMillis();
        System.out.println("-------执行时间------ " + (endtime-starttime)/1000  + " 秒");
    }
    
    ------------------------------------------------------------------    
    /**
     * invokeAll  方式二
     */
    public static void main10(String[] args) throws Exception{
        ExecutorService executor = Executors.newFixedThreadPool(2);
        List<Callable<String>> calls = new ArrayList<Callable<String>>();
         
        System.out.println("程序启动");
         
        for(int i=0;i<10;i++){
            Callable<String> callable = new Callable<String>(){
                @Override
                public String call() throws Exception {
                    StringBuffer stringBuffer = new StringBuffer();
                    for (int y = 0; y < 10; y++) {
                        stringBuffer.append(new Random(2).nextInt()).append(y);
                        Thread.sleep(100);
                    }
 
                    return stringBuffer.toString();
                }
            };
            calls.add(callable);
        }
         
        List<Future<String>> invokeAll = executor.invokeAll(calls);
         
        for(Future<String> future : invokeAll){
            System.out.println("结果= " + future.get());
        }
         
        System.out.println("程序结束");
         
        executor.shutdown();
         
    }
    // 代码应用
    public void loadDictProductDef() throws Exception {
        ExecutorService executor = Executors.newFixedThreadPool(30);
        List<Callable<String>> calls = new ArrayList<Callable<String>>();

        List<DictProductDefEntity> defList = dictProductDefDao.loadDictProductDef();
        int total = defList.size();
        int pos = 0;
        while(pos < total){
            List<DictProductDefEntity> list = defList.subList(pos, Math.min(pos += 500, total));
            Callable<String> callable = new Callable<String>() {
                @Override
                public String call() throws Exception {
                    for (DictProductDefEntity one : list) {
                        DictProductDef def = TransformPacking.transDictProductDef(one);
                        productDefDao.save(def);
                    }
                    return String.valueOf(list.size());
                }
            };
            calls.add(callable);
        }
        logger.info("-----------------> 线城运行start");
        List<Future<String>> invokeAlls = executor.invokeAll(calls);
        for(Future<String> future : invokeAlls){
            logger.info("-------" + future.get());
        }
        logger.info("-----------------> 线城运行结束");
    }
     ------------------------------------------------------------------    
    /**
     * Future  submit 方式二
     */
    public static void main4(String[] args) throws Exception{
        long starttime = System.currentTimeMillis();
        ExecutorService executor = Executors.newFixedThreadPool(10);
         
        List<Future<String>> resultList = new ArrayList<Future<String>>();
        for(int i=1; i<6 ;i++){
            Future<String> future = executor.submit(new RealData2("a"+i));
            resultList.add(future);
        }
         
        System.out.println("请求完毕");
         
         
        for(Future<String> one :resultList){
            // 取得call()方法的返回值 如果此时get方法没有执行完成,则依然会等待,知道所有都返回结果
            System.out.println("数据=" +  one.get());
        }
        System.out.println("执行完了");
        executor.shutdown();
         
        long endtime = System.currentTimeMillis();
        System.out.println("-------执行时间------ " + (endtime-starttime)/1000  + " 秒");
    }
     
    /**
     *  超时
     */
    public static void main5(String[] args) throws Exception{
        long starttime = System.currentTimeMillis();
        ExecutorService executor = Executors.newFixedThreadPool(1);
         
        List<RealData2> list = new ArrayList<RealData2>();
        for(int i=1; i<20 ;i++){
            list.add(new RealData2("a"+i));
        }
         
        System.out.println("请求完毕");
         
        try{
//          List<Future<String>> invok = executor.invokeAll(list);
            // 5秒超时 程序停止
            List<Future<String>> invok = executor.invokeAll(list, 5, TimeUnit.SECONDS);
             
            for(Future<String> one :invok){
                // 取得call()方法的返回值 如果此时call()方法没有执行完成,则依然会等待,知道所有都返回结果
                System.out.println("数据=" +  one.get());
            }
            System.out.println("执行完了");
            executor.shutdown();
             
            long endtime = System.currentTimeMillis();
            System.out.println("-------执行时间------ " + (endtime-starttime)/1000  + " 秒");
        }catch(Exception e){
            System.out.println("时间超时,程序停止");
        }
    }
     
    public static void main7(String[]args){
        System.out.println("请求完毕");
        new Thread(new Runnable(){
            @Override
            public void run() {
                try {
                    System.out.println("等待执行中");
                    StringBuffer sb = new StringBuffer();
                    for(int i =1;i<6;i++){
                        TimeUnit.SECONDS.sleep(2);
                        System.out.println(sb.append("...").toString());
                    }
                    System.out.println("执行成功");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();;
        System.out.println("异步执行");
    }
   
    ------------------------------------------------------------------    
    public static void main8(String[] args) throws Exception{
        Integer total_task = 0;
        ExecutorService  pool = Executors.newFixedThreadPool(2);
        CompletionService<String> cService = new ExecutorCompletionService<String>(pool);
         
        System.out.println("请求完毕");
         
        for(int i=1; i<5 ;i++){
            total_task ++;
            cService.submit(new RealData2("a"+i));
        }
         
         
        for(int i=1; i<total_task ;i++){
            Future<String> future = cService.take();
            System.out.println("数据=" +  future.get());
        }
         
        pool.shutdown();
         
        System.out.println("执行完了");
         
        /**
         * ExecutorService 是按加入线程池的顺序返回,后面的任务完成了,前面的任务却没有完成,主程序就那样等待在那儿,直到完成再继续执行。
         * CompletionService 能够拿到最先完成的任务的返回值的返回值,它的submit的task不一定是按照加入时的顺序完成的
         */
    }
     
     -----------------------------------------------------------------------------------------------------------
    public static void main9(String[] args) throws Exception{
        Integer total_task = 0;
        ExecutorService  pool = Executors.newFixedThreadPool(2);
        BlockingQueue<Future<String>> queue = new LinkedBlockingQueue<Future<String>>();
         
        System.out.println("请求完毕");
         
        for(int i=1; i<5 ;i++){
            total_task ++;
            Future<String> future = pool.submit(new RealData2("a"+i));
            queue.add(future);
        }
         
         
        for(int i=1; i<total_task ;i++){
            Future<String> future = queue.take();
            System.out.println("数据=" +  future.get());
        }
         
        pool.shutdown();
         
        System.out.println("执行完了");
         
        /**
         * 主线程并不能保证首先获得的是最先完成任务的线程返回值,take方法是阻塞方法,后面的任务完成了,
         * 前面的任务却没有完成,主程序就等待在那儿,只到前面的完成了,它才知道原来后面的也完成了。
         */
    }

    -----------------------------------------------------------------------------------------------------------
    private static final ExecutorService EXECUTOR_SERVICE = Executors.newFixedThreadPool(100);

    public void asyncAnalysis(ContentDto dto) {
        EXECUTOR_SERVICE.submit(() -> {
            try {
                nlpAnalysis(dto);
            } catch (Exception e) {
                LOGGER.error("", e);
            } finally {
                redisService.sremOidKey(dto.getOid());
            }
        });
    }
    -----------------------------------------------------------------------------------------------------------
     
    public static void main11() throws Exception {
        ExecutorService executorService = Executors.newFixedThreadPool(1);
 
        FutureTask<List<String>> futureTask0 = new FutureTask<>(()->doCompanyAnalysis("逐笔列表","记住一起"));
        FutureTask<List<String>> futureTask1 = new FutureTask<>(()->doCompanyAnalysis("titaltotal","枚举值"));
        executorService.submit(futureTask0);
        executorService.submit(futureTask1);
 
        System.out.println("请求完毕");
 
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
 
        // 取得call()方法的返回值 如果此时get方法没有执行完成,则依然会等待
        System.out.println("数据0=" + futureTask0.get());
        System.out.println("数据1=" + futureTask1.get());
        System.out.println("执行完了");
 
        executorService.shutdown();
    }
     
    public static List<String> doCompanyAnalysis(String nf, String content) {
        List<String> list = new ArrayList<>();
        list.add(nf);
        list.add(content);
        return list;
    }
     
    public static void main(String[] args) throws Exception {
        main11();
    }
 
}
 


package chapter5;
 
import java.util.concurrent.Callable;
 
/*
 * Created by 13 on 2017/5/8.
 */
public class RealData2 implements Callable<String> {
    private String data;
 
    public RealData2(String data) {
        this.data = data;
    }
 
    @Override
    public String call() throws Exception {
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < 10; i++) {
            stringBuffer.append(data);
            Thread.sleep(100);
        }
 
        return stringBuffer.toString();
    }
}
-----------------------------------------------------------------------------------------------------------


package chapter5;
 
/**
 * 多线程同时操作同一个变量
 * @author fenglei.ma
 */
public class Counter {
 
    public static  int  count = 0;
 
    /**
     * 增加 synchronized 关键字,保证在多线程的时候,同一时刻只能有一个线城能够使用此方法
     */
    public synchronized static void inc() {
        try {
            Thread.sleep(1);
        } catch (Exception e) {
        }
        count++;
    }
 
    public static void main(String[] args) {
        System.out.println("程序启动");
        for (int i = 0; i < 1000; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Counter.inc();
                }
            }).start();
        }
        try {
            Thread.sleep(1000); // 休眠1秒,确保线程执行完毕
        } catch (Exception e) {
        }
        // 如果不加 synchronized 这里每次运行的值都有可能不同,可能为1000 ,加上synchronized 才能保证累加
        System.out.println("运行结果:count=" + count);
    }
}
-----------------------------------------------------------------------------------------------------------
package com.csf.myproject.core.synchron;

/**
 * 多线程同时操作同一个变量
 * 使用同步 模拟多个窗口出售火车票
 * @author fenglei.ma 2018年3月20日 上午10:11:26
 */
public class Ticket implements Runnable {

    private int num;// 票数量
    private boolean flag = true;// 若为false则售票停止

    public Ticket(int num) {
        this.num = num;
    }

    @Override
    public void run() {
        while (flag) {
            ticket();
        }
    }

    // 使用代码块  或者直接在方法上加synchornized
    private void ticket() {
        synchronized (this) {
            try {
                if (num <= 0) {
                    flag = false;
                    return;
                }
                Thread.sleep(20);// 模拟延时操作

                // 输出当前窗口号以及出票序列号
                System.out.println(Thread.currentThread().getName() + "售出票序列号:" + num--);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
/*  窗口01售出票序列号:5
    窗口01售出票序列号:4
    窗口03售出票序列号:3
    窗口03售出票序列号:2
    窗口03售出票序列号:1*/
    public static void main(String[] args) {
        Ticket ticket = new Ticket(5);
        Thread window01 = new Thread(ticket, "窗口01");
        Thread window02 = new Thread(ticket, "窗口02");
        Thread window03 = new Thread(ticket, "窗口03");
        window01.start();
        window02.start();
        window03.start();
    }
}
 
-----------------------------------------------------------------------------------------------------------
package chapter5;
 
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
 
/**
 * @author fenglei.ma
 */
public class ThreadManager {
 
    private static final ExecutorService threadPool = Executors.newCachedThreadPool();
 
    public static void main(String[] args) {
        ThreadManager th = new ThreadManager();
        th.start();
    }
 
    public void start() {
        threadPool.submit(new ResearchIndexerThread("http:", "get"));
        threadPool.submit(new ResearchIndexerThread("www.baidu.com:", "post"));
 
        Future<String> future = threadPool.submit(new GetExchangeThread("www.baidu.com:", "post"));
        System.out.println("结果=" + future);
        Future<String> future1 = threadPool.submit(new GetExchangeThread("www.baidu.com:", "post"));
        System.out.println("结果1=" + future1);
    }
 
    class ResearchIndexerThread implements Runnable {
        private String indexUrl;
        private String method;
 
        public ResearchIndexerThread(String indexUrl, String method) {
            this.indexUrl = indexUrl;
            this.method = method;
        }
 
        @Override
        public void run() {
            System.out.println(indexUrl + method);
        }
    }
 
    class GetExchangeThread implements Callable<String> {
        private String requestUrl;
        private String method;
 
        public GetExchangeThread(String requestUrl, String method) {
            this.requestUrl = requestUrl;
            this.method = method;
        }
 
        @Override
        public String call() {
            return requestUrl + method;
        }
    }
 
}

 

posted @ 2017-11-27 16:51  百合叶  阅读(115)  评论(0)    收藏  举报