คำถามติดแท็ก executorservice

ExecutorService เป็นอ็อบเจ็กต์ Java ที่มีพูลของเธรดที่มีการจัดการและสามารถจัดตารางงานที่ส่งสำหรับเธรดเหล่านี้ได้ กลยุทธ์การจัดตารางเวลาแตกต่างกันไปในการใช้งานที่มีอยู่มากมาย

25
วิธีการรอให้เธรดทั้งหมดเสร็จสิ้นโดยใช้ ExecutorService
ฉันต้องทำงานบางอย่างทีละ 4 อย่างเช่นนี้: ExecutorService taskExecutor = Executors.newFixedThreadPool(4); while(...) { taskExecutor.execute(new MyTask()); } //...wait for completion somehow ฉันจะได้รับการแจ้งเตือนได้อย่างไรเมื่อทั้งหมดเสร็จสมบูรณ์ สำหรับตอนนี้ฉันไม่สามารถคิดอะไรได้ดีไปกว่าการตั้งตัวนับโกลบอลบางตัวและลดมันลงที่ส่วนท้ายของทุกภารกิจ หรือรับรายการ Futures และใน infinite loop monitor isDone สำหรับพวกเขาทั้งหมด อะไรคือวิธีแก้ปัญหาที่ดีกว่าที่ไม่เกี่ยวข้องกับการวนซ้ำไม่สิ้นสุด? ขอบคุณ

6
Java Timer เทียบกับ ExecutorService?
java.util.Timerฉันมีรหัสที่ฉันกำหนดการงานโดยใช้ ฉันมองไปรอบ ๆ และเห็นExecutorServiceสามารถทำเช่นเดียวกัน ดังนั้นคำถามนี้ตรงนี้คุณเคยใช้TimerและExecutorServiceจัดตารางเวลางานอะไรคือสิ่งที่คุณจะได้รับจากการใช้มากกว่าคนอื่น? ยังต้องการตรวจสอบว่ามีใครใช้Timerชั้นเรียนและพบปัญหาใด ๆ ซึ่งExecutorServiceแก้ไขได้สำหรับพวกเขา

17
การตั้งชื่อเธรดและเธรดพูลของ ExecutorService
สมมติว่าฉันมีแอปพลิเคชั่นที่ใช้ Executorเฟรมเวิร์ก Executors.newSingleThreadExecutor().submit(new Runnable(){ @Override public void run(){ // do stuff } } เมื่อฉันเรียกใช้แอปพลิเคชันนี้ในดีบักเกอร์เธรดจะถูกสร้างขึ้นด้วยชื่อ (ค่าเริ่มต้น) ต่อไปนี้: Thread[pool-1-thread-1]ไปนี้: อย่างที่คุณเห็นนี่มันไม่มีประโยชน์มากนักและเท่าที่ฉันบอกได้Executorเฟรมเวิร์กไม่มีวิธีง่าย ๆ ในการตั้งชื่อเธรดหรือเธรดพูลที่สร้างขึ้น ดังนั้นหนึ่งจะไปเกี่ยวกับการให้ชื่อสำหรับเธรด / thread-pool อย่างไร Thread[FooPool-FooThread]ยกตัวอย่างเช่น

12
การจัดการข้อยกเว้นจากงาน Java ExecutorService
ฉันกำลังพยายามใช้ThreadPoolExecutorคลาสของ Java เพื่อทำงานหนักจำนวนมากด้วยจำนวนเธรดที่แน่นอน แต่ละงานมีหลายสถานที่ซึ่งอาจล้มเหลวเนื่องจากข้อยกเว้น ฉันได้ subclassed ThreadPoolExecutorและฉันได้แทนที่afterExecuteวิธีที่ควรจะให้ข้อยกเว้นที่ไม่ถูกตรวจพบในขณะที่ทำงาน อย่างไรก็ตามฉันไม่สามารถใช้งานได้ ตัวอย่างเช่น: public class ThreadPoolErrors extends ThreadPoolExecutor { public ThreadPoolErrors() { super( 1, // core threads 1, // max threads 1, // timeout TimeUnit.MINUTES, // timeout units new LinkedBlockingQueue<Runnable>() // work queue ); } protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); …

14
ExecutorService วิธีรองานทั้งหมดให้เสร็จ
วิธีที่ง่ายที่สุดในการรอให้ภารกิจทั้งหมดExecutorServiceเสร็จสิ้นคืออะไร งานของฉันคือการคำนวณเป็นหลักดังนั้นฉันแค่ต้องการเรียกใช้งานจำนวนมาก - หนึ่งในแต่ละหลัก ตอนนี้การตั้งค่าของฉันมีลักษณะดังนี้: ExecutorService es = Executors.newFixedThreadPool(2); for (DataTable singleTable : uniquePhrases) { es.execute(new ComputeDTask(singleTable)); } try{ es.wait(); } catch (InterruptedException e){ e.printStackTrace(); } ComputeDTaskใช้ runnable เรื่องนี้ดูเหมือนจะดำเนินงานได้อย่างถูกต้อง แต่รหัสเกิดปัญหาในด้วยwait() IllegalMonitorStateExceptionนี่เป็นเรื่องแปลกเพราะฉันเล่นไปด้วยตัวอย่างของเล่นและดูเหมือนว่ามันจะใช้ได้ uniquePhrasesมีองค์ประกอบหลายสิบหลายหมื่น ฉันควรใช้วิธีอื่นหรือไม่? ฉันกำลังมองหาบางอย่างที่ง่ายที่สุด

7
เลือกระหว่างการส่งของ ExecutorService และ ExecutorService
ฉันควรเลือกระหว่างการ ส่งหรือดำเนินการของ ExecutorService ได้อย่างไรหากมูลค่าที่ส่งคืนไม่ใช่ข้อกังวลของฉัน หากฉันทดสอบทั้งสองฉันไม่เห็นความแตกต่างระหว่างสองอย่างนี้ยกเว้นค่าที่ส่งคืน ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); threadExecutor.execute(new Task()); ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); threadExecutor.submit(new Task());


6
จะรับ id เธรดจากเธรดพูลได้อย่างไร
ฉันมีกลุ่มเธรดคงที่ที่ฉันส่งงานให้ (จำกัด5เธรด) ฉันจะทราบได้อย่างไรว่าเธรดหนึ่งใน5เธรดใดดำเนินการกับงานของฉัน (เช่น "เธรด # 3 จาก5กำลังทำงานนี้") ExecutorService taskExecutor = Executors.newFixedThreadPool(5); //in infinite loop: taskExecutor.execute(new MyTask()); .... private class MyTask implements Runnable { public void run() { logger.debug("Thread # XXX is doing this task");//how to get thread id? } }

13
เป็นไปไม่ได้ที่จะสร้างพูลเธรดแบบแคชที่มีขนาด จำกัด ?
ดูเหมือนว่าจะเป็นไปไม่ได้ที่จะสร้างพูลเธรดที่แคชโดย จำกัด จำนวนเธรดที่สามารถสร้างได้ นี่คือวิธีการใช้งาน Executors.newCachedThreadPool แบบคงที่ในไลบรารี Java มาตรฐาน: public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } ดังนั้นการใช้เทมเพลตนั้นเพื่อสร้างพูลเธรดที่แคชขนาดคงที่: new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>()); ตอนนี้ถ้าคุณใช้สิ่งนี้และส่งงาน 3 อย่างทุกอย่างจะเรียบร้อย การส่งงานเพิ่มเติมใด ๆ จะทำให้ถูกปฏิเสธข้อยกเว้นในการดำเนินการ ลองทำสิ่งนี้: new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>()); จะส่งผลให้เธรดทั้งหมดดำเนินการตามลำดับ กล่าวคือเธรดพูลจะไม่สร้างเธรดมากกว่าหนึ่งเธรดเพื่อจัดการงานของคุณ นี่คือบั๊กในวิธีการรันของ ThreadPoolExecutor? หรืออาจจะเป็นความตั้งใจ? หรือมีวิธีอื่นบ้าง? …

3
FixedThreadPool vs CachedThreadPool: ความชั่วร้ายน้อยกว่าสองอย่าง
ฉันมีโปรแกรมที่สร้างเธรด (~ 5-150) ซึ่งทำงานได้หลายอย่าง ในขั้นต้นฉันใช้ a FixedThreadPoolเพราะคำถามที่คล้ายกันนี้แนะนำว่าเหมาะสำหรับงานที่มีชีวิตอยู่นานกว่าและด้วยความรู้ที่ จำกัด มากเกี่ยวกับมัลติเธรดฉันจึงคิดว่าอายุการใช้งานเฉลี่ยของเธรด (หลายนาที) " มีอายุยืนยาว " อย่างไรก็ตามฉันเพิ่งเพิ่มความสามารถในการสร้างเธรดเพิ่มเติมและการทำเช่นนั้นทำให้ฉันอยู่เหนือขีด จำกัด เธรดที่ฉันตั้งไว้ ในกรณีนี้จะดีกว่าไหมหากเดาและเพิ่มจำนวนเธรดที่ฉันอนุญาตหรือเปลี่ยนเป็นไฟล์CachedThreadPoolเธรดเพื่อให้ฉันไม่มีเธรดที่สูญเปล่า ลองใช้ทั้งคู่ในเบื้องต้นดูเหมือนจะไม่มีความแตกต่างดังนั้นฉันจึงมีแนวโน้มที่จะไปด้วยวิธีCachedThreadPoolเดียวที่จะหลีกเลี่ยงของเสีย อย่างไรก็ตามช่วงชีวิตของเธรดหมายความว่าฉันควรเลือกFixedThreadPoolและจัดการกับเธรดที่ไม่ได้ใช้แทนหรือไม่? คำถามนี้ทำให้ดูเหมือนว่าเธรดพิเศษเหล่านั้นจะไม่สูญเปล่า แต่ฉันขอขอบคุณสำหรับคำชี้แจง

9
ExecutorService ที่ขัดขวางงานหลังจากหมดเวลา
ฉันกำลังมองหาการใช้งานExecutorServiceที่สามารถกำหนดระยะหมดเวลาได้ งานที่ส่งไปยัง ExecutorService ถูกขัดจังหวะหากใช้เวลานานกว่าการหมดเวลาในการรัน การใช้สัตว์ร้ายเช่นนี้ไม่ใช่เรื่องยาก แต่ฉันสงสัยว่าจะมีใครรู้ถึงการใช้งานที่มีอยู่หรือไม่ นี่คือสิ่งที่ฉันคิดขึ้นจากการสนทนาด้านล่าง มีคำแนะนำอะไรมั้ย? import java.util.List; import java.util.concurrent.*; public class TimeoutThreadPoolExecutor extends ThreadPoolExecutor { private final long timeout; private final TimeUnit timeoutUnit; private final ScheduledExecutorService timeoutExecutor = Executors.newSingleThreadScheduledExecutor(); private final ConcurrentMap<Runnable, ScheduledFuture> runningTasks = new ConcurrentHashMap<Runnable, ScheduledFuture>(); public TimeoutThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.