线程的启动方式以及SingleThreadExecutor

作者: mister_tao | 来源:发表于2016-09-09 17:51 被阅读111次

    启动线程方式一: 线程可以驱动任务,因此需要一种描述任务的方式,可以由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可以让你省去只是为了维持某些原型而进行的各种协调努力。

    相关文章

      网友评论

        本文标题:线程的启动方式以及SingleThreadExecutor

        本文链接:https://www.haomeiwen.com/subject/qzeeettx.html