05 Dec 2017
多线程的基础使用
大量的查询运算,java的单线程已经吃不消了。为了充分使用服务器的资源,我们可以采用多线程。 单线程查询4000 个格点的时候,每次都需要读960个文件。 这样的效率是非常低的。
下面介绍多线程的简单实用
1. 继承Thread类
public class MyThread extends Thread {
public void run() {
System.out.println("MyThread.run()");
}
}
// main
public static void main(String[] args) {
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
myThread1.start();
myThread2.start();
}
2. 实现Callable类
Callable类只有一个方法 call(),同时使用了泛型函数
public class MyCallable implements Callable<String> {
private String taskNum;
public MyCallable(String taskNum) {
this.taskNum = taskNum;
}
public String call() throws Exception {
System.out.println(">>>" + taskNum + "任务启动");
Date dateTmp1 = new Date();
Thread.sleep(1000);
Date dateTmp2 = new Date();
long time = dateTmp2.getTime() - dateTmp1.getTime();
System.out.println(">>>" + taskNum + "任务终止");
return taskNum + "任务返回运行结果,当前任务时间【" + time + "毫秒】";
}
}
调用方式:
public static void main(String[] args) throws Exception {
//创建一个线程池
ExecutorService executor = Executors.newFixedThreadPool(10);
// 创建多个有返回值的任务.。 这里使用list是一样的结果
Map<String, FutureTask<String>> tasks = new HashMap<String,
FutureTask<String>>();
for (int i = 0; i < 10; i++) {
MyCallable myCallable = new MyCallable("xxx" + i);
FutureTask<String> task = new FutureTask<String>(myCallable);
tasks.put("i" + i, task);
if (!executor.isShutdown()) {
executor.submit(task);
}
}
// 关闭线程池
executor.shutdown();
// 获取所有并发任务的运行结果
Set<String> keys = tasks.keySet();
for (String para : keys) {
FutureTask<String> futureTask = tasks.get(para);
String ret = futureTask.get();
System.out.println(ret);
}
}
运行结果:
>>>xxx0任务启动
>>>xxx2任务启动
>>>xxx3任务启动
>>>xxx1任务启动
>>>xxx4任务启动
>>>xxx5任务启动
>>>xxx6任务启动
>>>xxx7任务启动
>>>xxx8任务启动
>>>xxx9任务启动
>>>xxx4任务终止
>>>xxx1任务终止
>>>xxx3任务终止
>>>xxx2任务终止
>>>xxx0任务终止
>>>xxx9任务终止
xxx9任务返回运行结果,当前任务时间【1008毫秒】
xxx0任务返回运行结果,当前任务时间【1009毫秒】
xxx1任务返回运行结果,当前任务时间【1008毫秒】
xxx2任务返回运行结果,当前任务时间【1009毫秒】
xxx3任务返回运行结果,当前任务时间【1009毫秒】
xxx4任务返回运行结果,当前任务时间【1001毫秒】
>>>xxx8任务终止
>>>xxx7任务终止
>>>xxx6任务终止
>>>xxx5任务终止
xxx5任务返回运行结果,当前任务时间【1011毫秒】
xxx6任务返回运行结果,当前任务时间【1011毫秒】
xxx7任务返回运行结果,当前任务时间【1011毫秒】
xxx8任务返回运行结果,当前任务时间【1011毫秒】
Process finished with exit code 0
业精于勤,荒于嬉; 行成于思,毁于随。
pnunu
at 22:22