六盘水南宁网站建设,商城网站系统,牡丹江站,xampp装wordpress线程池
线程池状态
1.RUNNING
表示线程池正常运行#xff0c;既能接受新任务#xff0c;也会正常处理队列中的任务
2. SHUTDOWN
当调用线程池的shutdown(#xff09;方法时#xff0c;线程池就进入SHUTDOWN状态#xff0c;表示线程池处于正在关闭状态#xff0c;此状…线程池
线程池状态
1.RUNNING
表示线程池正常运行既能接受新任务也会正常处理队列中的任务
2. SHUTDOWN
当调用线程池的shutdown(方法时线程池就进入SHUTDOWN状态表示线程池处于正在关闭状态此状态下线程池不会接受新任务但是会继续把队列中的任务处理完
3. STOP
当调用线程池的shutdownnow(方法时线程池就进入STOP状态表示线程池处于正在停止状态此状态下线程池既不会接受新任务了也不会处理队列中的任务并且正在运行的线程也会被中断
4. TIDYING
线程池中没有线程在运行后线程池的状态就会自动变为TIDYING并且会调用terminated()该方法是空方法留给程序员进行扩展。
5.TERMINATED
terminated(方法执行完之后线程池状态就会变为TERMINATED
创建线程执行任务
方法一继承Thread类
public class test extends Thread {public static void main(String[] args) {test t new test();t.start();}Overridepublic void run() {System.out.println(hello);}
}
方法二实现Runna接口
public class test implements Runnable{public static void main(String[] args) {Thread tnew Thread(new test());t.start();}Overridepublic void run() {System.out.println(hello);}
}
方法三实现Callable接口
public class test implements CallableString {public static void main(String[] args) throws ExecutionException, InterruptedException {FutureTaskString futureTask new FutureTask(new test());Thread thread new Thread(futureTask);thread.start();String result futureTask.get();System.out.println(result);}Overridepublic String call() throws Exception {return null;}
}
方法四利用线程池来创建线程
public class test implements Runnable {public static void main(String[] args) {ExecutorService executorService Executors.newFixedThreadPool(10);executorService.execute(new test());}Overridepublic void run() {System.out.println(test);}
}
为什么不用Executors
发现创建的队列为LinkedBlockingQueue是一个无界阻塞队列如果使用该线程池执行任务如果任务过多就会不断的添加到队列中任务越多占用的内存就越多最终可能耗尽内存导致OOM。
Executors来创建线程池也不能自定义线程的名字不利于排查问题所以建议直接使用ThreadPoolExecutor来定义线程池这样可以灵活控制。
ThreadLocal
ThreadLocal是Java中所提供的线程本地存储机制可以利用该机制将数据缓存在某个线程内 部该线程可以在任意时刻、任意方法中获取缓存的数据
实现原理
ThreadLocal底层是通过ThreadLocalMap来实现的每个Thread对象中都存在一个ThreadLocalMapMap的key为ThreadLocal对象Map的value为需要缓存的值
应用场景
连接管理一个线程持有一个连接例如数据库连接该连接对象可以在不同的方法之间进行传递线程之间不共享同一个连接
内存泄漏
因为当ThreadLocal对象使用完之后应该要把设置的key,value也就是Entry对象进行回收但线程池中的线程不会回收而线程对象是通过强引用指向ThreadLocalMap,ThreadLocalMap也是通过强引用指向Entry对象线程不被回收Entry对象也就不会被回收从而出现内存泄漏
解决办法在使用了ThreadLocal对象之后手动调用ThreadLocal的remove方法手动清楚Entry对象