从 innerTask 停止 ScheduledThreadPoolExecutor

Stop ScheduledThreadPoolExecutor from innerTask

所以我有一个线程,其中 ScheduledThreadPoolExecutor 是使用周期性任务创建的,所以我想在条件发生时从任务中停止我的 ScheduledThreadPoolExecutor

之后,从存在 ScheduledThreadPoolExecutor 的线程向另一个线程发出通知。也许我做错了什么,我无法从 InnerThread 向父 Thread Buyer 发送通知。之后 Buyer 向 MasterContainer 发送另一个通知。

我该怎么做?

import java.util.Date;
import java.util.concurrent.*;

public class Buyer implements Runnable {

    private CommonObj cmnObj;

    public Buyer(CommonObj msg) {
        this.cmnObj = cmnObj;
    }

    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        System.out.println(name + " is starting");

        ScheduledThreadPoolExecutor sch = (ScheduledThreadPoolExecutor)
                Executors.newScheduledThreadPool(1);
        sch.setRemoveOnCancelPolicy(true);

        FutureRunnable periodicTask = new FutureRunnable() {

            @Override
            public void run() {
                try {
                    System.out.println("\t periodicTask Execution Time: "
                            + ScheduledExample.fmt.format(new Date()));

                    try {
                        Thread.sleep(2 * 1000);

                        synchronized (this) {
                            System.out.println("\t periodicTask need to close: "
                                    + ScheduledExample.fmt.format(new Date()));

                            this.getFuture().cancel(true);
                            System.out.println("\t periodicTask cancelled: "
                                    + ScheduledExample.fmt.format(new Date()));
                            this.notify();
                            return;
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    System.out.println("\t periodicTask End Time: "
                            + ScheduledExample.fmt.format(new Date()));
                } catch (Exception e) {

                }
            }
        };

        Future<?> periodicFuture = sch.scheduleAtFixedRate(periodicTask, 3, 3, TimeUnit.SECONDS);
        periodicTask.setFuture(periodicFuture);
        synchronized (sch) {
            try {
                System.out.println(name + " is before wait");
                sch.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(name + " is before notify");

            this.notify();
        }

        System.out.println(name + " is ended");


    }



}

abstract class FutureRunnable implements Runnable {
    private Future<?> future;

    public Future<?> getFuture() {
        return future;
    }

    public void setFuture(Future<?> future) {
        this.future = future;
    }
}

在您的代码中,您的内部任务在 periodicTask 上同步,外部任务在 sch 上同步,这是行不通的。

如果你想同步内线程和外线程,你应该在同一个对象上同步,以及在同一个对象上调用waitnotify