标签:
实现一个线程需要实现Runnable接口,或继承Thread类并实现run()方法。在run()方法中定义你需要线程完成的任务。
public class LiftOff implements Runnable { protected int countDown = 10; private static int taskCount = 0; private final int id = taskCount++; public LiftOff(){ } public LiftOff(int count){ this.countDown = count; } public String state(){ return "#"+id+"("+(countDown>0?countDown:"LiftOff")+")."; } @Override public void run() { // TODO Auto-generated method stub while(countDown-- > 0){ System.out.print(state()); Thread.yield(); } System.out.println("liftoff already!!"); } }
线程的一些操作和特征:
为了简化多线程编程java SE5提供了执行器类来为我们管理Thread对象,执行器类在最底层定义了一个Executor接口,并声明了一个execute方法。
ExecutorService
是真正意义上的线程池接口,其声明了一些线程池的基本方法,submit方法向线程池中提交一个任务并返回一个Future对象;shutdown方法在执行完先前提交的任务后,不再接受新任务;shutdownNow方法 试图停止所有正在执行的任务,停止等待执行的任务,并返回等待执行任务列表。ExecutorService还有声明了批量执行任务的方法,就不详细介绍了。
ThreadPoolExecutor
是真正的线程池实现。其实现了Executor的execute方法,execute方法与submit方法的区别在于execute是没有返回值的。作为线程池,应当提供的功能有设置线程池的线程数量,提供存放等待执行线程的容器,以及对过剩的任务的处理方式,下面来看看ThreadPoolExecutor的构造函数。
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
corePoolSize线程池中维持的线程数量,即使有线程是空闲的。
maximumPoolSize线程池中最大的线程数
keepAliveTime超出corePoolSize的线程,在结束之前维持等待新任务的空闲状态时间
unit时间单元SECONDS、MILLISECONDS、MICROSECONDS…
workQueue用于保存等待执行的任务,需要注意的是该队列仅保持有execute提交的任务
threadFactory executor创建新线程使用的工厂
handler用来处理超出线程池容量的任务
ScheduledExecutorService
是一个ExecutorService,它提供了在给定一个延时或周期性调度任务的功能。
public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit); public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit); public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit); public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit);
前两个函数在等待延时delay后执行任务;scheduleAtFixedRate在等待时间delay后,并以period重复执行任务;scheduleWithFixedDelay在等待初始延时initialDelay后,并每次执行任务后等待delay重复执行任务。
Executors
Executors主要是提供了一些工厂方法,用来产生常用的线程池:
public static void cachedPool() { ExecutorService exec = Executors.newCachedThreadPool(); for (int i = 0; i < 5; ++i) { exec.submit(new LiftOff()); } exec.shutdown(); } public static void fixedPool() { ExecutorService exec = Executors.newFixedThreadPool(3); for (int i = 0; i < 5; ++i) { exec.submit(new LiftOff()); } exec.shutdown(); } public static void singleThread() { ExecutorService exec = Executors.newSingleThreadExecutor(); for (int i = 0; i < 5; ++i) { exec.submit(new LiftOff()); } exec.shutdown(); } public static void scheduledThread() { ScheduledThreadPoolExecutor exec = (ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(2); exec.scheduleAtFixedRate(new LiftOff(), 3, 12, TimeUnit.SECONDS); exec.scheduleAtFixedRate(new LiftOff(), 3, 6, TimeUnit.SECONDS); }
参考资料:http://blog.csdn.net/sd0902/article/details/8395677, JDK 1.7 API
标签:
原文地址:http://www.cnblogs.com/pzhblog/p/4564551.html