目录
执行结果:编辑 5、对比调用线程池和直接创建线程程序执行速度
1、JUC并发编程
它是Java.util.concurrent包的简写
2、线程池
其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建和销毁线程对象的错误,节省了资源的开销
3、Executor接口
这是Java并发编程的基础接口,此接口只有一个方法execute(),表示接收一个实现了Runnale接口的对象做为执行参数来执行,该对象我们可以理解为需要执行的任务,至于这个任务交给哪个线程执行,由具体的Executor决定
4、ExecutorServicw接口
它表示线程池,它是Executor接口的子接口
它有一个shutdown();该线程池不再接受新的任务,等待队列中 任务会继续执行完成
executor.shutdown();
Executors帮助类,这是Executor接口的帮助类,它提供了一系列静态的工厂方法帮我们创建不同的ExecutorService线程池对象
executor.shutdown();
newFixedThreadPool(线程数)——创建指定大小 的线程
(1)语句:创建线程池
ExecutorService executor=
Executors.newFixedThreadPool(10);
(2)语句:调用线程:
executor.execute(new MyThread());
newSingleThreadExecutors()
创建一个只有一个线程的线程池
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test15 {
public static void main(String[] args) {
ExecutorService executor=
Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
executor.execute(new MyThread());
}
executor.shutdown();
}
}
public class MyThread implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()
+ "线程正在执行……");
}
}
执行结果: 5、对比调用线程池和直接创建线程程序执行速度
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test17 {
public static void main(String[] args) {
myPool();
}
//50万线程不用线程池
//50万线程用线程池
private static void myPool(){
long start= System.currentTimeMillis();
Random random=new Random();
List<Integer> list =new ArrayList<>();
ExecutorService executorService =
Executors.newFixedThreadPool(10);
for (int i = 0; i < 500000; i++) {
executorService.execute(()->{
list.add(random.nextInt());
});
}
System.out.println("50万线程线程池,需要时间" + (System.currentTimeMillis() -start));
}
}
执行结果:
原因:创建内含10个线程线程池,然后调用50w次
不用线程池:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test17 {
public static void main(String[] args) {
myThread();
}
//50万线程不用线程池
private static void myThread(){
long start= System.currentTimeMillis();
Random random=new Random();
List<Integer> list =new ArrayList<>();
for (int i = 0; i < 500000; i++) {
Thread thread =new Thread(()->{
list.add(random.nextInt());
});
thread.start();
}
System.out.println("50万线程不用线程池,需要时间" + System.currentTimeMillis());
}
}
执行结果:
原因:创建50个线程,所以时间长
Thread thread =new Thread(()->{
list.add(random.nextInt());
});
6、插入知识点:输出系统时间/程序执行的时间
public class Test16 {
public static void main(String[] args) {
long start =System.currentTimeMillis();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(System.currentTimeMillis() - start);
}
}
输出系统时间:
System.out.println(System.currentTimeMillis());
程序执行的时间
long start =System.currentTimeMillis();
System.out.println(System.currentTimeMillis() - start);