At the heart of designing computer systems and software lies the problem of managing time. We take for granted that modern computer systems such as desktop computers can manage many apps running concurrently and produce the effect that the software is running simultaneously. Of course we know that, for the most part, our single processor computers can do only one thing at a time. The magic is performed by slight of hand in the operating system (OS), which juggles apps and turns its attention from one to the next so quickly that they appear to run at once. In the old days, the unit of concurrency for such systems was the app or process. To the OS, a process was more or less a black box that decided what do to on its own. If an app required greater concurrency, it could get it only by running multiple processes and communicating between them, but this was a heavyweight approach and not very elegant. Later, the concept of threads was introduced. Threads provide fine-grained concurrency within a process, under the app's own control. Threads have existed for a long time but have historically been tricky to use. In Java, support for threading is built into the language, making it easier to work with threads. In Java 5.0, a whole new set of utilities was introduced that address common patterns and practices in multithreaded apps and raise them to the level of tangible Java APIs. Collectively, this means that Java is a language that supports threading both natively and at a high level. It also means that Java's APIs take full advantage of threading, so it's important that you become familiar with these concepts early in your exploration of Java. Threads are integral to the design of many Java APIs, especially those involved in client-side apps, graphics, and sound. For example, when we look at GUI coding later in this tutorial, you'll see that a component's paint( ) method isn't called directly by the app but rather by a separate drawing thread within the Java runtime system. At any given time, many such background threads may be performing activities in parallel with your app. On the server side, writing code that does explicit thread handling is less common and actively discouraged in the context of app servers and web apps. In those scenarios, the server environment should control the allocation of time. However, Java threads are there, servicing every request and running your app components. It's important to understand how your code fits into that environment. In this chapter, we'll talk about writing apps that create and use their own threads explicitly. We'll talk about the low-level thread support built into the Java language first and then discuss the new Java 5.0 java.util.concurrent thread utilities package in detail at the end of this chapter. Laying a foundation in Java threads will help you better understand the functionality that has been added in Java 5.0.