首页 > 编程知识 正文

java 线程池原理,java获取线程名称

时间:2023-05-03 16:38:51 阅读:51002 作者:3870

本篇主要介绍java.util.concurrent包中的ExecutorService。 ExecutorService是线程池在Java中的实现。 另一方面,在ExecutorService中,ExecutorService是在Java中在线程池中定义的接口,在其java.util.concurrent包中,该接口

因为在ExecutorService接口上有两个Java API实现,所以这两个是Java线程池的具体实现类。 有关这两个实现类的详细信息,请单击此处)。

1.thread pool Executor2. scheduledthreadpoolexecutor之外,ExecutorService还继承了executor接口。 (请注意区分执行程序接口和执行程序工厂类。 )此接口只有一个执行程序接口

二、创建ExecutorService创建任何ExecutorService实例(线程池)都需要g,但Java为我们提供了Executors工厂类。 这有助于我们轻松创建各种类型的ExecutorService线程池、Executors线程池

1. newCachedThreadPool创建可缓存的线程池。 如果线程池的长度超过需要处理的长度,则可以灵活地重用空闲线程。 如果不能重用,请创建新线程。 2. newFixedThreadPool创建一个固定长度的线程池来控制线程的最大并发行数,超出的线程将在队列中等待。 3. newScheduledThreadPool创建固定长度的线程池,以支持计划和定期任务执行。 4. newSingleThreadExecutor创建单线程池,只在唯一的工作线程上执行任务,以便所有任务都按指定顺序(FIFO、LIFO、优先级)执行。 注: Executors只是一个工厂类,所有方法都返回两个类的实例: ThreadPoolExecutor和ScheduledThreadPoolExecutor。

三、使用executorservice executorserviceexecutorservice=executors.newfixedthreadpool (10; executorservice.execute (new runnable () {public void run ) ) system.out.println (同步任务); (); executorService.shutdown (; 四、执行ExecutorService执行ExecutorService有以下几种执行方法:

-execute(Runnable )-submit(runnable )-submit (callable )- invokeAny)- invokeAll) 4.1 execute (runnable ) runable

executorserviceexecutorservice=executors.newsinglethreadexecutor (; executorservice.execute (new runnable () {public void run ) ) system.out.println (同步任务); (); executorService.shutdown (; 这个方法有问题。 就是说不能知道task的执行结果。 如果想得到任务的执行结果,可以传递Callable的实例(后述)。

4.2提交(runnable )提交(runnable )提交(runnable )和执行(runnable )之间的区别在于前者可以返回Future对象。 可以检查返回的Future对象中提交的任务是否完成。 请看

future future=executorservice.submit (new runnable () {public void run ) ) system.out.println )异步任务' }; ); future.get (; //returnsnullifthetaskhasfinishedcorrectly .任务执行完成后,future.get ()方法返回null。 请注意,future.get ()方法会生成块。

4.3“提交”(Callable )“调用”(Callable )与“提交”(Runnable )类似,也会返回Future对象,否则“提交”(calllable )会调用

void的,没有返回值。请看下面实例:

Future future = executorService.submit(new Callable(){public Object call() throws Exception { System.out.println("Asynchronous Callable"); return "Callable Result";}});System.out.println("future.get() = " + future.get());

如果任务执行完成,future.get()方法会返回Callable任务的执行结果。注意,future.get()方法会产生阻塞。

4.4 invokeAny(…)

invokeAny(...)方法接收的是一个Callable的集合,执行这个方法不会返回Future,但是会返回所有Callable任务中其中一个任务的执行结果。这个方法也无法保证返回的是哪个任务的执行结果,反正是其中的某一个。请看下面实例:

ExecutorService executorService = Executors.newSingleThreadExecutor();Set<Callable<String>> callables = new HashSet<Callable<String>>();callables.add(new Callable<String>() {public String call() throws Exception { return "Task 1";}});callables.add(new Callable<String>() {public String call() throws Exception { return "Task 2";}});callables.add(new Callable<String>() { public String call() throws Exception { return "Task 3";}});String result = executorService.invokeAny(callables);System.out.println("result = " + result);executorService.shutdown();

大家可以尝试执行上面代码,每次执行都会返回一个结果,并且返回的结果是变化的,可能会返回“Task2”也可是“Task1”或者其它。

4.5 invokeAll(…)

invokeAll(...)与 invokeAny(...)类似也是接收一个Callable集合,但是前者执行之后会返回一个Future的List,其中对应着每个Callable任务执行后的Future对象。情况下面这个实例:

ExecutorService executorService = Executors.newSingleThreadExecutor();Set<Callable<String>> callables = new HashSet<Callable<String>>();callables.add(new Callable<String>() {public String call() throws Exception { return "Task 1";}});callables.add(new Callable<String>() { public String call() throws Exception { return "Task 2";}});callables.add(new Callable<String>() {public String call() throws Exception { return "Task 3";}});List<Future<String>> futures = executorService.invokeAll(callables);for(Future<String> future : futures){System.out.println("future.get = " + future.get());}executorService.shutdown(); 五、ExecutorService的关闭

当我们使用完成ExecutorService之后应该关闭它,否则它里面的线程会一直处于运行状态。

举个例子,如果的应用程序是通过main()方法启动的,在这个main()退出之后,如果应用程序中的ExecutorService没有关闭,这个应用将一直运行。之所以会出现这种情况,是因为ExecutorService中运行的线程会阻止JVM关闭。

如果要关闭ExecutorService中执行的线程,我们可以调用ExecutorService.shutdown()方法。在调用shutdown()方法之后,ExecutorService不会立即关闭,但是它不再接收新的任务,直到当前所有线程执行完成才会关闭,所有在shutdown()执行之前提交的任务都会被执行。

如果我们想立即关闭ExecutorService,我们可以调用ExecutorService.shutdownNow()方法。这个动作将跳过所有正在执行的任务和被提交还没有执行的任务。但是它并不对正在执行的任务做任何保证,有可能它们都会停止,也有可能执行完成。

关于Java线程池类ThreadPoolExecutor、ScheduledThreadPoolExecutor及Executors工厂类更详细介绍,点击这里

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。