
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __java_util_concurrent_ScheduledThreadPoolExecutor__
#define __java_util_concurrent_ScheduledThreadPoolExecutor__

#pragma interface

#include <java/util/concurrent/ThreadPoolExecutor.h>

class java::util::concurrent::ScheduledThreadPoolExecutor : public ::java::util::concurrent::ThreadPoolExecutor
{

public: // actually package-private
  virtual jlong now();
private:
  void delayedExecute(::java::lang::Runnable *);
  void cancelUnwantedTasks();
public:
  virtual jboolean remove(::java::lang::Runnable *);
public: // actually protected
  virtual ::java::util::concurrent::RunnableScheduledFuture * decorateTask(::java::lang::Runnable *, ::java::util::concurrent::RunnableScheduledFuture *);
  virtual ::java::util::concurrent::RunnableScheduledFuture * decorateTask(::java::util::concurrent::Callable *, ::java::util::concurrent::RunnableScheduledFuture *);
public:
  ScheduledThreadPoolExecutor(jint);
  ScheduledThreadPoolExecutor(jint, ::java::util::concurrent::ThreadFactory *);
  ScheduledThreadPoolExecutor(jint, ::java::util::concurrent::RejectedExecutionHandler *);
  ScheduledThreadPoolExecutor(jint, ::java::util::concurrent::ThreadFactory *, ::java::util::concurrent::RejectedExecutionHandler *);
  virtual ::java::util::concurrent::ScheduledFuture * schedule(::java::lang::Runnable *, jlong, ::java::util::concurrent::TimeUnit *);
  virtual ::java::util::concurrent::ScheduledFuture * schedule(::java::util::concurrent::Callable *, jlong, ::java::util::concurrent::TimeUnit *);
  virtual ::java::util::concurrent::ScheduledFuture * scheduleAtFixedRate(::java::lang::Runnable *, jlong, jlong, ::java::util::concurrent::TimeUnit *);
  virtual ::java::util::concurrent::ScheduledFuture * scheduleWithFixedDelay(::java::lang::Runnable *, jlong, jlong, ::java::util::concurrent::TimeUnit *);
  virtual void execute(::java::lang::Runnable *);
  virtual ::java::util::concurrent::Future * submit(::java::lang::Runnable *);
  virtual ::java::util::concurrent::Future * submit(::java::lang::Runnable *, ::java::lang::Object *);
  virtual ::java::util::concurrent::Future * submit(::java::util::concurrent::Callable *);
  virtual void setContinueExistingPeriodicTasksAfterShutdownPolicy(jboolean);
  virtual jboolean getContinueExistingPeriodicTasksAfterShutdownPolicy();
  virtual void setExecuteExistingDelayedTasksAfterShutdownPolicy(jboolean);
  virtual jboolean getExecuteExistingDelayedTasksAfterShutdownPolicy();
  virtual void shutdown();
  virtual ::java::util::List * shutdownNow();
  virtual ::java::util::concurrent::BlockingQueue * getQueue();
public: // actually package-private
  static ::java::util::concurrent::atomic::AtomicLong * access$0();
  static ::java::util::concurrent::BlockingQueue * access$1(::java::util::concurrent::ScheduledThreadPoolExecutor *);
private:
  jboolean volatile __attribute__((aligned(__alignof__( ::java::util::concurrent::ThreadPoolExecutor)))) continueExistingPeriodicTasksAfterShutdown;
  jboolean volatile executeExistingDelayedTasksAfterShutdown;
  static ::java::util::concurrent::atomic::AtomicLong * sequencer;
  static jlong NANO_ORIGIN;
public:
  static ::java::lang::Class class$;
};

#endif // __java_util_concurrent_ScheduledThreadPoolExecutor__
