Java Thread具体使用
(1)直接创建匿名线程使用
new Thread(){
public void run(){
//...
System.out.println("Sub Thread Runnable");
}
}.start();
(2)使用Runnable包装待执行的任务
new Thread(new Runnable(){
public void run(){
//...
System.out.println("Sub Thread Runnable");
}
}).start();
Java多线程介绍
参考文章 http://www.importnew.com/19011.html
java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类
概括一下线程池
corePoolSize:核心池的大小
maximumPoolSize:线程池最大线程数
keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止
unit:参数keepAliveTime的时间单位,有7种取值
workQueue:一个阻塞队列,用来存储等待执行的任务,这个参数的选择也很重要,会对线程池的运行过程产生重大影响,一般来说,这里的阻塞队列有以下几种选择:
(ArrayBlockingQueue;LinkedBlockingQueue;SynchronousQueue;)
threadFactory:线程工厂,主要用来创建线程;
handler:表示当拒绝处理任务时的策略,有四种取值:(ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务)
线程池使用
注意
线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式使得写的时候更加明确线程池的运行规则,规避资源耗尽的风险。
//不建议的方式
ExecutorService executor = Executors.newSingleThreadExecutor();
Executors实际是对ThreadPoolExecutor的使用上的一种封装
ThreadPoolExecutor具体使用
ThreadPoolExecutor executor=new ThreadPoolExecutor(4, 6, 1, TimeUnit.HOURS, new ArrayBlockingQueue<Runnable>(10));
executor.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});