线程池处理数据
1:写一个本地的wordCount程序,通过程序把程序的jar文件通过网络传输同其他机器上,使这个程序在其他机器上运行,把结果还发送到本机上。
流程如下:
client.java
package cn.edu360.day10;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 1:建立网络连接
* 2:身份验证
* 3:发送jar包存放位置
* 4:发送jar文件
* 5:发送指令
* 6:接收返回结果
* @author Administrator
* 注意:流用到的时候再获得
*
*/
public class Client {
private static final String KEY = "天王盖地虎";
public static void main(String[] args) throws Exception{
//1:建立网络连接
Socket sc = new Socket("localhost", 9999);
//建立输入输出流
ObjectOutputStream oos = new ObjectOutputStream(sc.getOutputStream());
//2:发送验证信息
oos.writeObject(KEY);
oos.flush();
ObjectInputStream ois = new ObjectInputStream(sc.getInputStream());
String value = (String)ois.readObject();
if(value.equals("宝塔镇河妖")){//验证成功
//3:发送jar包存放位置 (服务端接收的jar位置)
oos.writeObject("E:/data/wc.jar");
oos.flush();
//4:发送jar文件 (本机的存放位置)
FileInputStream input = new FileInputStream("E:/wc.jar");
byte[] b = new byte[1024];
int length = 0;
while((length=input.read(b))!=-1){
oos.write(b, 0, length);
}
oos.flush();
input.close();
//5:发送指令
oos.writeObject("java -jar E:/data/wc.jar");
oos.flush();
//6:接收返回结果
String result = (String)ois.readObject();
System.out.println(result);
}else{
System.out.println("验证失败");
}
}
}
server.java
package cn.edu360.day10;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 1:建立网络通信
* 2:校验身份
* 3:接收jar文件的存放路径
* 4:接收jar文件
* 5:接收执行命令
* 6:执行jar文件
* 7:返回结果
* @author Administrator
*
*/
public class Server {
private static final String KEY = "天王盖地虎";
public static void main(String[] args) throws Exception {
ServerSocket ssc = new ServerSocket(9999);
while(true){
Socket accept = ssc.accept();
//获取输入输出流,包装成对象流
System.out.println("获取连接");
ObjectInputStream ois = new ObjectInputStream(accept.getInputStream());
//2:校验身份
System.out.println("-----");
String key = (String)ois.readObject();
ObjectOutputStream oos = new ObjectOutputStream(accept.getOutputStream());
if(key.equals(KEY)){//校验成功的时候
oos.writeObject("宝塔镇河妖");
oos.flush();
//3:接收jar文件的存放路径
String filePath = (String)ois.readObject();
//4:接收jar文件
FileOutputStream outPut = new FileOutputStream(filePath);
byte[] b = new byte[1024];
int length = 0;
while((length = ois.read(b))!=-1){
outPut.write(b, 0, length);
}
outPut.flush();
outPut.close();
//5:接收执行命令
String command = (String)ois.readObject();
//6执行jar文件
String resutlt = Utile.runJar(command);
//7:返回结果
oos.writeObject(resutlt);
oos.flush();
oos.close();
ois.close();
}else{//校验失败的时候
oos.writeObject("小鸡炖蘑菇");
oos.flush();
}
}
}
}
ThreadMian.java
package cn.edu360.day10;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.FutureTask;
/**
* 创建多线程任务并执行,得到返回结果并合并结果
* @author Administrator
*
*/
public class ThreadMain {
public static void main(String[] args) throws Exception{
Map<String, Integer> map = new HashMap<>();
String jarPath = "E:/data/wc.jar";
String localJarPath = "E:/wc.jar";
String cmd = "java -jar E:/data/wc.jar";
String jarPath2 = "E:/data/wc2.jar";
String localJarPath2 = "E:/wc2.jar";
String cmd2 = "java -jar E:/data/wc2.jar";
CalableClient cc1 = new CalableClient(jarPath, localJarPath, cmd);
FutureTask<String> f1 = new FutureTask<>(cc1);
new Thread(f1).start();
String string = f1.get();
//System.err.println(string);
CalableClient cc2 = new CalableClient(jarPath2, localJarPath2, cmd2);
FutureTask<String> f2 = new FutureTask<>(cc2);
new Thread(f2).start();
String string2 = f2.get();
//把返回值合并到一块
StringBuilder sb = new StringBuilder();
sb.append(string+" ");
sb.append(string2+" ");
String ret = sb.toString();
String[] split = ret.split("\\s");
//按照空格切分数据
for (String string3 : split) {
if(string3!=null&&!string3.equals("")){
//对每一个数据进行切分 word=3
String[] split2 = string3.split("=");
String word = split2[0];
Integer count = Integer.parseInt(split2[1]);
Integer orDefault = map.getOrDefault(word, 0);
orDefault+=count;
map.put(word, orDefault);
}
}
//遍历输出
Set<Entry<String,Integer>> entrySet = map.entrySet();
for (Entry<String, Integer> entry : entrySet) {
System.out.println(entry);
}
}
}
Utile,java
package cn.edu360.day10;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Utile {
/**
* 根据指定的命令,执行,获取返回结果
* @param command
* @return
* @throws IOException
*/
public static String runJar(String command) throws IOException {
Runtime runtime = Runtime.getRuntime();
Process exec = runtime.exec(command);
BufferedReader br = new BufferedReader(new InputStreamReader(exec.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
while((line = br.readLine())!=null){
sb.append(line+" ");
}
return sb.toString();
}
}
wordCount.java
package cn.edu360.day10;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
* hello=2
* hi=1
*
* @author Administrator
*
*/
public class WordCount {
public static void main(String[] args) throws Exception {
Map<String, Integer> map = new HashMap<>();
BufferedReader br= new BufferedReader(new FileReader("E:/data/wordCount2.txt"));
StringBuilder sb = new StringBuilder();
String line = null;
while((line = br.readLine())!=null){
//System.out.println(line);
sb.append(line+" ");
}
String ret = sb.toString();
String[] split = ret.split("\\s");
for (String string : split) {
Integer orDefault = map.getOrDefault(string, 0);
orDefault++;
map.put(string, orDefault);
}
Set<Entry<String,Integer>> entrySet = map.entrySet();
for (Entry<String, Integer> entry : entrySet) {
System.out.println(entry);
}
br.close();
}
}
calable.java
package cn.edu360.day10;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.concurrent.Callable;
/**
* 带返回值的client
* @author Administrator
*
*/
public class CalableClient implements Callable<String>{
private static final String KEY = "天王盖地虎";
private String jarPath;
private String localJarPath;
private String cmd;
public CalableClient() {
super();
}
public CalableClient(String jarPath, String localJarPath, String cmd) {
super();
this.jarPath = jarPath;
this.localJarPath = localJarPath;
this.cmd = cmd;
}
@Override
public String call() throws Exception {
//1:建立网络连接
Socket sc = new Socket("localhost", 9999);
//建立输入输出流
ObjectOutputStream oos = new ObjectOutputStream(sc.getOutputStream());
//2:发送验证信息
oos.writeObject(KEY);
oos.flush();
ObjectInputStream ois = new ObjectInputStream(sc.getInputStream());
String value = (String)ois.readObject();
if(value.equals("宝塔镇河妖")){//验证成功
//3:发送jar包存放位置 (服务端接收的jar位置)
oos.writeObject(jarPath);
oos.flush();
//4:发送jar文件 (本机的存放位置)
FileInputStream input = new FileInputStream(localJarPath);
byte[] b = new byte[1024];
int length = 0;
while((length=input.read(b))!=-1){
oos.write(b, 0, length);
}
oos.flush();
input.close();
//5:发送指令
oos.writeObject(cmd);
oos.flush();
//6:接收返回结果
String result = (String)ois.readObject();
return result;
}else{
System.out.println("验证失败");
}
return null;
}
}
TestCalable.java
package cn.edu360.day10.test;
import java.util.Random;
import java.util.concurrent.Callable;
/**
* 1:继承Thread类
* 2:实现Runnable接口
* @author Administrator
* Callable接口是创建带有返回值的线程的
* 泛型代表的是返回值
package cn.edu360.day10.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 测试执行jar文件
* @author Administrator
*
*/
public class TestRunJarFile {
public static void main(String[] args) throws Exception {
//得到java运行环境
Runtime runtime = Runtime.getRuntime();
String command = "java -jar e:/wc.jar";
//执行程序,并获取进程信息
Process exec = runtime.exec(command);
//获取控制台上面的输出信息
BufferedReader br = new BufferedReader(new InputStreamReader(exec.getInputStream()));
//遍历输出
String line = null;
while((line=br.readLine())!=null){
System.out.println(line);
}
}
}
* 需要重写(实现)call方法,call方法的返回值也就是线程的返回值 * */public class TestCalable implements Callable<Integer>{@Overridepublic Integer call() throws Exception {int sum = 0;//获取随机数Random rand = new Random();for(int i = 0;i<100;i++){int nextInt = rand.nextInt(10);sum=sum+nextInt+1;}return sum;}}
TestRunJarFile
package cn.edu360.day10.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 测试执行jar文件
* @author Administrator
*
*/
public class TestRunJarFile {
public static void main(String[] args) throws Exception {
//得到java运行环境
Runtime runtime = Runtime.getRuntime();
String command = "java -jar e:/wc.jar";
//执行程序,并获取进程信息
Process exec = runtime.exec(command);
//获取控制台上面的输出信息
BufferedReader br = new BufferedReader(new InputStreamReader(exec.getInputStream()));
//遍历输出
String line = null;
while((line=br.readLine())!=null){
System.out.println(line);
}
}
}
TestThread.java
package cn.edu360.day10.test;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
public class TestThread {
public static void main(String[] args) throws Exception{
//创建实现了Calable接口的类
TestCalable c1 = new TestCalable();
//使用Future进行包装
FutureTask<Integer> futureTask = new FutureTask<>(c1);
//把Future传进Thread类里面
Thread t1 = new Thread(futureTask);
//执行线程
t1.start();
//等待返回结果
//futureTask.get(10,TimeUnit.MINUTES);
Integer integer = futureTask.get();
System.out.println(integer);
}
}