Thread之 join 应用

实现一个这样功能 :

 

package day01Thread;

import aes.DecryptUtils;
import aes.EncryptionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 线程 join() 主要是阻塞当前线程,CPU控制权交给其他线程,其他线程执行完毕后,回到当前线程
 *  实现这个功能:
 *    1:主线程是一个集合,需要循环这个集合,从集合取出数据后
 *    2:需要对数据进行处理 (数据处理比较耗时,比如是解密操作)
 *    3:解密完毕之后,在把数据归还给 刚刚集合(主线程中)
 */
public class ThreadJoinDemo {
    private static final String SOURCE_TAG = "hello world";
    private static final String PASSWORD = "123456789";
    private static String enCryptContent;
    private static List<String> enCryptContentList = new ArrayList();
    private static List<String> source = new ArrayList();
    public static void main(String[] args) {
        // 产生数据(服务器)
        for (int i = 0;i <1000;i++) {
            // 子线程中加密数据
            System.out.println("source 加密之前 = "+ SOURCE_TAG + "  " + i);
            String encriptContent = EncryptionUtils.encryption(PASSWORD,SOURCE_TAG + "  " +i);
            source.add(encriptContent);
            System.out.println("source 加密之后 = "+ encriptContent);
        }

        // 数据加密完毕之后,在子线程中解密(客户端),而且必须等子线程解密完毕之后,主线程在进行for循环
        for (int i= 0;i<1000;i++) {
            MyCallable callable = new MyCallable();
            FutureTask<String> task = new FutureTask(callable);
            callable.setIndex(i);
            try {
                Thread thread = new Thread(task);
                thread.start();
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String decriptContent = null;
            try {
                // 阻塞到 子线程解密完毕
                decriptContent = (String)task.get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
            enCryptContentList.add(decriptContent);
            System.out.println("source 解密之后添加到集合size = "+ enCryptContentList.size()
                    + "  decriptContent = " + decriptContent + "  thread = " + Thread.currentThread().getName());
        }
    }

    public static class MyCallable<String> implements Callable {
        private int index;
        @Override
        public String call() throws Exception {
            String decriptContent = (String) DecryptUtils.decryptContent(source.get(index), PASSWORD);
            System.out.println("source 加密之后在解密数据 = "+ decriptContent +
                    "  thread = " + Thread.currentThread().getName());
            return decriptContent;
        }

        public void setIndex(int index) {
            this.index = index;
        }
    }
}

填坑1 :

解决:

    

猜你喜欢

转载自blog.csdn.net/u013620306/article/details/107740332