java.util.concurrent.Executor


簡介:

An object that executes submitted {@link Runnable} tasks.

這個接口提供了一種將任務提交與每個任務的運行機制分離的方法。通常使用{@code Executor}而不是顯式創建線程。

例如:

不是為每一個任務調度

new Thread(new(RunnableTask())).start()

而是

Executor executor =  ... ;
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());

注意:Executor接口並不嚴格要求執行是異步的。

在最簡單的情況下,執行者可以立即在調用者的線程中運行提交的任務:

class DirectExecutor implements Executor {
       public void execute(Runnable r) {
              r.run();
       }
}    

更典型地,任務在調用者線程之外的某個線程中執行。

例如:下面的執行程序為每個任務生成一個新線程:

public class ThreadPerTaskExecutor implements Executor {
    public void execute(Runnable r) {
        new Thread(r).start();
    }
}

許多Executor實現對計划任務的方式和時間施加了某種限制。

下面的執行程序將任務提交序列化到第二個執行程序,演示了一個復合執行器(a composite executor)。

import java.util.ArrayDeque;
import java.util.Queue;
import java.util.concurrent.Executor;




public class SerialExecutor implements Executor {
    final Queue<Runnable> tasks = new ArrayDeque<Runnable>();
    final Executor executor;
    Runnable active;

    SerialExecutor(Executor executor) {
        this.executor = executor;
    }

    public synchronized void execute(final Runnable r) {
        tasks.offer(new Runnable() {
            public void run() {
                try {
                    r.run();
                } finally {
                    scheduleNext();
                }
            }
        });

        if (active == null) {
            System.out.println("active == null!");
            scheduleNext();
        }
    }

    protected synchronized void scheduleNext() {
        if ((active = tasks.poll()) != null) {
            executor.execute(active);
        }
    }
}

 

綜合演示:

import java.util.ArrayDeque;
import java.util.Queue;
import java.util.concurrent.Executor;

class DirectExecutor implements Executor {
    public void execute(Runnable r) {
        r.run();
    }
}


class ThreadPerTaskExecutor implements Executor {
    public void execute(Runnable r) {
        new Thread(r).start();
    }
}


public class SerialExecutor implements Executor {
    final Queue<Runnable> tasks = new ArrayDeque<Runnable>();
    final Executor executor;
    Runnable active;

    SerialExecutor(Executor executor) {
        this.executor = executor;
    }

    public synchronized void execute(final Runnable r) {
        tasks.offer(new Runnable() {
            public void run() {
                try {
                    r.run();
                } finally {
                    scheduleNext();
                }
            }
        });

        if (active == null) {
            System.out.println("active == null!");
            scheduleNext();
        }
    }

    protected synchronized void scheduleNext() {
        if ((active = tasks.poll()) != null) {
            executor.execute(active);
        }
    }
}


class SerialExecutorMain {
    public static void main(String[] args) {
        SerialExecutor serialExecutor = new SerialExecutor(new ThreadPerTaskExecutor());
        /**or**/
        //SerialExecutor serialExecutor = new SerialExecutor(new DirectExecutor());
        for (int i = 0; i < 100; i++) {
            serialExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("Hello!");
                }
            });
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM