Salesforce gives you four core asynchronous Apex flavours — @future, Queueable, Batch, and Schedulable — plus a few event-driven options (Platform Events, Change Data Capture) that are also async by design. Each tool exists because a different shape of work doesn’t fit inside a single synchronous transaction.
The four core Apex flavours
| Flavour | Shape of work | Pick when |
|---|---|---|
@future | Fire-and-forget, primitive args | One quick callout, small task; legacy code |
| Queueable | Same as @future plus chaining, complex types, JobId tracking | Anything you’d use @future for in a new project |
| Batch Apex | Process large datasets in 200-record chunks | More than ~10,000 records, or work that exceeds sync governor limits |
| Schedulable | Run on a cron schedule | Recurring jobs (nightly cleanup, weekly reports) |
What each one actually does
@future — A static method marked @future is queued and runs in a separate transaction. Accepts only primitives, Ids, and collections of primitives. No chaining, no monitoring, no return value. The original async mechanism, kept for backward compatibility.
Queueable — A class implementing Queueable runs asynchronously when you call System.enqueueJob(new MyJob(...)). Accepts complex types (sObjects, custom classes). Returns a JobId for tracking. Can chain another Queueable. Supports callouts via Database.AllowsCallouts.
Batch Apex — A class implementing Database.Batchable<sObject> with three methods: start (returns the records or QueryLocator), execute (processes a chunk, default 200 records), and finish (called once when all chunks complete). Handles up to 50 million records per job.
Schedulable — A class implementing Schedulable with one method, execute(SchedulableContext). Scheduled via System.schedule(name, cronExp, instance) or via the Setup UI.
The event-driven async options
Beyond the four flavours, Salesforce has several event-driven async mechanisms:
- Platform Events — Publish/subscribe message bus. An Apex trigger can fire on the event consumer side, async to the publisher’s transaction.
- Change Data Capture (CDC) — Salesforce automatically publishes events on record changes. Subscribers receive them async.
- Async SOQL — Deprecated for most use cases; replaced by Big Object queries. Was used for large-volume queries against Big Objects.
- Apex Continuation — Lets a Visualforce or Aura controller make long-running callouts without blocking. (LWC has a different async pattern via
@wireand Promises.)
The decision tree
Need to run code outside the user's transaction?
├─ One quick callout, no chaining, no monitoring?
│ → @future (legacy) or Queueable (modern)
├─ Need to process > 10,000 records?
│ → Batch Apex
├─ Need to run on a clock?
│ → Schedulable, often calling a Batch or Queueable
└─ Need pub/sub between systems?
→ Platform Events or CDC
Common interview follow-ups
- Which one should I use by default in 2026? — Queueable. It’s the modern general-purpose tool.
- Can a Schedulable kick off a Batch? — Yes. The most common pattern: a Schedulable that runs at 2 AM and calls
Database.executeBatch(new MyBatch()). - Are Platform Events Apex async? — Platform Events themselves are infrastructure. Apex triggers on them run async to the publisher.
Verified against: Apex Developer Guide — Asynchronous Apex. Last reviewed 2026-05-17 for Spring ‘26.