草庐IT

Executorservice

全部标签

java - 您应该始终使用 ExecutorService 而不是启动自己的线程吗?

对于JDK>=1.5,启动线程的首选方式是否应该始终是执行器或执行器服务,或者如果您不需要ExecutorService提供的功能,是否仍然有理由更喜欢使用Thread.start?对于同步化,我曾经认为使用新的Lock实现是首选,直到我explainedotherwise.所以我想知道关于执行者的同样事情。它们只是处理更复杂案例的一种方式,还是应该成为标准选择? 最佳答案 JavaConcurrencyinPractice至少在第6.2节中明确指出:Theprimaryabstractionfortaskexecutioninth

Java 执行器 : wait for task termination.

这个问题在这里已经有了答案:Howtowaitforallthreadstofinish,usingExecutorService?(27个答案)关闭5年前。我需要提交一些任务,然后等待它们直到所有结果都可用。它们中的每一个都将一个String添加到一个Vector(默认情况下是同步的)。然后我需要为Vector中的每个结果启动一个新任务,但只有当所有以前的任务都停止工作时我才需要这样做。我想使用JavaExecutor,特别是我尝试使用Executors.newFixedThreadPool(100)以使用固定数量的线程(我有可变数量的任务,可以是10或500)但我是执行者的新手,我

java - 为什么我不能在 SecurityManager 下关闭我自己的 ExecutorService?

在默认安全管理器下,如果我创建一个ExecutorService(在这种情况下为ThreadPoolExecutor),我无法将其关闭,shutdown()只是调用checkPermission("modifyThread")并因此立即死亡:importjava.util.concurrent.*;classA{publicstaticvoidmain(String[]args){Threadct=Thread.currentThread();System.out.println("currentthread:"+ct);ct.checkAccess();//wehaveaccesst

java - 将 InheritableThreadLocal 与 ThreadPoolExecutor 一起使用——或者——不重用线程的 ThreadPoolExecutor

我正在尝试同时使用InheritableThreadLocal和ThreadPoolExecutor。这是因为ThreadPoolExecutor为每个池重用线程(毕竟它是一个池),这意味着InheritableThreadLocal没有按预期工作。现在这个问题对我来说似乎很明显,但追踪起来特别麻烦。我使用InheritableThreadLocal这样几个顶级进程中的每一个都有自己的数据库连接,用于它自己和它产生的任何子进程。我不只是使用一个共享连接池,因为每个顶级进程在提交到数据库和/或准备大量反复使用的PreparedStatements之前,都会对其连接进行大量多步骤工作。我在

java - 如何决定使用newCachedThreadPool还是newFixedThreadPool?

我正在做一个项目,我需要确保每个线程都在特定范围内工作。例如:NO_OF_THREADS:2NO_OF_TASKS:10如果线程数为2,任务数为10,则每个线程将执行10个任务。所以这意味着2个线程将执行20个任务。在实际情况下,这些数字(任务数和线程数)将非常高,因为它们都可以在我的代码中配置。在上面的例子中,第一个线程应该使用1和10之间的id,第二个线程应该使用之间的id11和20如果有更多线程,依此类推。之后每个线程都会建立一个数据库连接,然后插入到数据库中。所以我的以下代码运行良好。publicstaticvoidmain(String[]args){finalintnoOf

java - 了解 Java 固定线程池

我试图了解JavaFixedThreadPool在实践中是如何工作的,但文档没有回答我的问题。假设一个简单的场景,例如:ExecutorServiceES=Executors.newFixedThreadPool(3);ListFL;for(inti=1;i其中Task是一个Callable,它构造一些资源,使用它们,并返回一些输出。我的问题:完成for循环后,内存中有多少个Task?换句话说:一次构建它们的资源时是否只有3个Task,或者所有这些都是预先创建的,这样,在.submit之后我有200个任务(及其资源)等待执行?注意:资源构建发生在Task的构造函数中,而不是在call(

java - ExecutorService 是否在超出范围时收集垃圾?

我问这个问题是因为我正在创建很多执行程序服务,虽然我可能已经在某个地方有内存泄漏需要调查,但我认为最近对以下代码的更改实际上使它变得更糟,因此我是试图确认发生了什么:@FunctionalInterfacepublicinterfaceBaseConsumerextendsConsumer{@Overridedefaultvoidaccept(finalPathpath){Stringname=path.getFileName().toString();ExecutorServiceservice=Executors.newSingleThreadExecutor(runnable->

java - 在 ScheduledExecutorService 中运行的任务本身中停止周期性任务

在ScheduledExecutorService中运行时,有没有一种很好的方法可以从任务本身中停止重复任务?假设,我有以下任务:Futuref=scheduledExecutor.scheduleAtFixedRate(newRunnable(){intcount=0;publicvoidrun(){System.out.println(count++);if(count==10){//???cancelself}}},1,1,TimeUnit.SECONDS);在外部,通过f.cancel()很容易取消,但是如何在指定位置停止重复呢?(通过AtomicReference传递Futu

java - 在 ScheduledExecutorService 中运行的任务本身中停止周期性任务

在ScheduledExecutorService中运行时,有没有一种很好的方法可以从任务本身中停止重复任务?假设,我有以下任务:Futuref=scheduledExecutor.scheduleAtFixedRate(newRunnable(){intcount=0;publicvoidrun(){System.out.println(count++);if(count==10){//???cancelself}}},1,1,TimeUnit.SECONDS);在外部,通过f.cancel()很容易取消,但是如何在指定位置停止重复呢?(通过AtomicReference传递Futu

java - join 和 CountDownLatch 有什么区别?

当等待其他线程完成时,我们可以使用join或CountdownLatch。使用这两种机制的优缺点是什么? 最佳答案 如果您自己处理线程,则只能使用Thread.join。大多数人选择不直接处理线程处理的细节,而是使用ExecutorService为他们处理。ExecutorService不会直接显示它们是如何执行任务的,因此您必须使用CountDownLatch:(假设您不想只是shutdown整个服务,也就是。)ExecutorServiceservice=Executors.newFixedThreadPool(5);final