实现一个这样功能 :
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 :
解决: