线程的启动方式以及SingleThreadExecutor
启动线程方式一: 线程可以驱动任务,因此需要一种描述任务的方式,可以由Runnable接口来提供,要想定义任务,只需要实现Runnable接口并编写run()方法,使得该任务执行你的命令.
private static class LiftOff implements Runnable{
private int count = 10000;
@Override
public void run() {
while(count-- > 0){
System.out.println("count :"+count);
Thread.yield();
}
public static void main(String[] args) {
LiftOff liftOff = new LiftOff();
liftOff.run();
}
启动线程方式二: 将Runnable对象转变为工作任务的传统方式是把它提交给一个Thread构造器,Thread构造器只需要一个Runnable对象,然后调用start方法就可以启动
Thread t = new Thread(new LiftOff());
t.start();
启动线程方式三:使用Executor,创建线程池对象, 即ExecutorService 对象,然后调用exec()方法,
ExecutorService exec = Executors.newCachedThreadPool();
for(int i = 0; i < 5; i++)
exec.execute(new LiftOff());
exec.shutdown();
详细介绍第三种方式,Executor的三个方法:
1,newFixedThreadPool
2,newSingleThreadExecutor
3,newCachedThreadPool
如果向SingleThreadExecutor提交了多个任务,那么这些任务将排队,每个任务都会在下一个任务开始之前运行结束,所有的任务将使用相同的线程,下面的实例中,SingleThreadExecutor会序列化所有提交给它的任务,并会维护它自己的任务队列。
ExecutorService exec = Executors.newSingleThreadExecutor();
for(int i = 0; i < 5; i++)
exec.execute(new LiftOff());
exec.shutdown();
另外应用场景:假设你有大量的线程,那他们运行的任务将使用文件系统,你可以用SingleThreadExecutor来运行这些线程,以确保任意时刻在任务线程中都只有唯一的任务在运行,在这种方式中,你不需要在共享资源上处理同步,同时不会过度使用文件系统,有时更好的解决方案是在资源上同步,但是SingleThreadExecutor可以让你省去只是为了维持某些原型而进行的各种协调努力。