# Creating JobWork

The most important goal of a `BatchJob` class is to return an instance of `JobWork` describing what work should be done (`ThreadWorkUnits`) and have that work split into manageable chunks (`ThreadWork`) that can be processed by a single `ThreadWorker`.

Most commonly, `ThreadWorkUnits` contain only the ID values of the entities to be processed. For example, one can envision a process that performs an operation on a set of accounts. In general, one would expect that each `ThreadWorkUnit` would contain a single `AccountId`. The `ThreadWorker` objects would then be constructed in such a way that when asked to execute for a `ThreadWorkUnit` it would pull out the embedded `AccountId` and then perform the required business function.

There are convenience methods available from the `AbstractBatchJob` that make it easier to create `JobWork` instances. For example, the `createJobWorkForEntityQuery(Query)` method will accept a query returning `BusinessEntity` instances, and create a `JobWork` instance containing the appropriate number of `ThreadWork` instances, each containing (notwithstanding rounding) the same number of `ThreadWorkUnits`.

Parent topic: Creating a BatchJob