方法1:
public class ThreadCreat{
//Runnable接口是专门用来创建线程的执行体的。
public void creatThread(){
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
System.out.println("this a new thread");
}
});
}
}
方法2:新建一个类继承Thread类,Thread类本身实现了Runnable接口,可以通过继承重写Thread类的run方法(实现Runnable接口而来)来写线程的执行体,然后实例化这个新建的类来新建一个线程;
线程池的作用:每来一个任务都要新建一个线程的话很消耗资源,很可能会耗尽内存。于是使用线程池。可以用线程池重用线程,控制并发数量。
线程池的结构:worker :每个worker拥有一个线程。可以设置线程池中线程的个数(有核心线程数和最大线程数)。当任务多于线程池的核心线程个数时(在这之前每有一个任务就新建一个线程)就会在队列里排队。等待worker去队列中拉取任务并执行。线程池的线程也有一定的线程存活时间,(当暂时没有任务了总不能一直让线程在那占用资源啊)
线程池的参数:线程池的核心线程数//超过核心线程数就到队列里等待
线程池的最大线程数//当队列满了就新建线程,不能超过最大线程数
线程池的线程空闲存活时间(当线程数大于核心线程时,停止超过空闲时间的线程)
线程池线程工厂
线程池的任务队列:ArrayBlockingQueue有界队列,LinkedBlockingQueue无界队列,同步队列SynchronousQueque(没有容量,有任务必须立刻执行或者拒绝,所以同步),优先级队列RriorityBockingQueque(无界)
任务拒绝策略(当线程数达到了最大线程数且队列满拒绝处理):1.抛弃不抛出异常2.抛弃不抛出异常3.抛弃队头的任务4.由当前线程执行
线程池java实现的接口和类:顶层Executor接口,继承了Executor的ExecutorService接口,实现了ExecutorService的AbstractExecutorService类,继承了AbstractExecutorService的ExecutorThreadPool。
几种ThreadPool类型:
//可以让任务立刻执行,也可重用线程,但是不能控制并发数
Executors.newCachedThreadPool();
//创建一个线程池,缓冲池容量大小为Integer.MAX_VALUE
//可以让任务按顺序执行
Executors.newSingleThreadExecutor();
//创建容量为1的线程池,无界队列
Executors.newFixedThreadPool(
int
);
//创建固定容量大小的线程池
原文:https://www.cnblogs.com/cai-cai777/p/10886265.html