ตามโพสต์ นี้ :

public class ConditionCheckingTask implements Runnable 
{
    private final ScheduledExecutorService ses ;
    private final Instant whenInstantiated = Instant.now() ;

    // Constructor
    public ConditionCheckingTask( final ScheduledExecutorService ses ) {
        this.ses = ses ;
    }

    @Override
    public void run() {
        if( someConditionIsTrue ) {
            doSomething ;
        } else if ( ChronoUnit.MINUTES.between( this.whenInstantiated , Instant.now() ) > 100000 ) {
            // We have exceeded our time limit, so let this task die.
            return ;
        } else {  // Else wait a minute to check condition again.
            this.ses.schedule( this , 1 , TimeUnit.MINUTES ) ;
        }
    }
}

กำหนดการงานเองภายในวิธีการ run() สมมุติว่าจำกัดเวลาอยู่ที่ 100000 แล้วจะมีการสร้าง 100000 เธรดหรือไม่ เนื่องจากการเรียกตามกำหนดเวลาแต่ละครั้งจะต้องใช้เธรดแยกกันเพื่อเรียกใช้ใช่ไหม

ตอบ

each schedule call will need a separate thread to run, right?

อาจจะไม่.

ทั้งหมดที่เรารู้จากโค้ดที่คุณแสดงคือที่sesอ้างอิงถึงScheduledExecutorServiceและเนื่องจากนั่นเป็นเพียงอินเทอร์เฟซ เราไม่รู้จริงๆ ว่ามันจะทำอะไร แต่การใช้งานจริงของอินเทอร์เฟซนั้นน่าจะเป็นกลุ่มของเธรดบาง ประเภท

พูลเธรดอย่างง่ายมีคิวการบล็อกของงาน และเธรดของผู้ปฏิบัติงานจำนวนน้อย ที่แต่ละ เธรดอยู่ในลูปที่รองานและดำเนินการ

    while (true) {
        Runnable task = queue.take();
        task.run();
    }

ด้วยวิธีนี้ จำนวนเธรดที่ใช้อาจน้อยกว่าจำนวนงานที่ส่งไปยังคิวมาก

A ScheduledExecutorServiceนั้นScheduledThreadPoolExecutorทำงานในลักษณะเดียวกันเกือบทั้งหมด ยกเว้นว่า Queue เป็น ลำดับความสำคัญ ของQueue คิวลำดับความสำคัญส่งคืนงานตามลำดับที่มีกำหนดการให้รันแทนที่จะส่งคืนในลำดับเดียวกันกับที่ส่ง ผู้ปฏิบัติงานแต่ละคนวนรอบ รอจนกว่างานที่ส่วนหัวของคิวครบกำหนด จากนั้นจึงรับ () งาน รัน และกลับไปรองานถัดไป เช่นเดียวกับในกลุ่มเธรดอย่างง่าย