好处: 1.1加速程序的运算,这点可以将一个复杂的任务交给多个线程来完成; 1.2可以是实现异步,线程之间互不影响,主线程处理主线程的任务,分支线程处理分支任务;
package com.ydlclass.thread;
//单线程与多线程之间的效率差别问题;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class UseMutiThread implements Callable<Long> {//业务需求,从1加到1亿;分成5个线程来计算最后加载一起,和单线程的方式比较谁的速度更快;
private int from;
private int to;
public UseMutiThread() {
}
public UseMutiThread(int from, int to) {
this.from = from;
this.to = to;
}
@Override
public Long call() throws Exception {
Long res = 0L;
for (int i = from; i < to ; i++) {
res += i;
}
return res;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
long start = System.currentTimeMillis();
Long res = 0L;
for (int i = 0; i < 100000000; i++) {
res += i;
}
System.out.println(res);
long end = System.currentTimeMillis();
System.out.println(end - start);
System.out.println("多线程的情形下");
res = 0L;
//多线程情况下
long start1 = System.currentTimeMillis();
// for (int i = 0; i < 5; i++) {
// FutureTask<Long> futureTask = new FutureTask<>(new UseMutiThread(i*20000000,(i+1)*20000000));
// Thread thread = new Thread(futureTask);
// thread.start();
// Long integer = futureTask.get();//表面上看这个线程的创建是多个线程,但是由于get方法是阻塞的,for循环中的下一个线程的创建是在前一个线程的之后才会被创建所以相当于单线程;
// res += integer;
//
// }
FutureTask[] futureTasks = new FutureTask[10];
for (int i = 0; i < 10; i++) {//此for循环只负责创建多个线程;
FutureTask<Long> futureTask = new FutureTask<>(new UseMutiThread(i*10000000,(i+1)*10000000));
Thread thread = new Thread(futureTask);
thread.start();
futureTasks[i] = futureTask;
}
for (int i = 0; i < 10; i++) {
Long o = (Long)(futureTasks[i].get());
res += o;
}
long end1 = System.currentTimeMillis();
System.out.println(end1 - start1);
System.out.println(res);
}
}
单线程和多线程之间的结果比较:(单线程使用了698ms,多线程只是用了295ms),但是线程不是越多速度就越快的。
4999999950000000
698
多线程的情形下
295
4999999950000000