With the advent of multicore processors, there is an increasing amount of interest in building concurrent applications capable of fully utilising their features. Developing applications for these platforms to take full advantage of the power of multicore capabilities remains a complex, error-prone, and challenging endeavour. Unfortunately, concurrency is not uniformly and externally expressed in most existing application models. The result is that concurrency and thread management are hidden within objects or components and intermixed with their functionalities. After demonstrating the tangling of code that results from the interaction of these two major concerns, this thesis describes a method of improving the concurrent program by applying a novel technique to separate the concerns: aspect-oriented programming, which aims to encapsulate concerns that crosscut the main program flow in separate entities into aspects.The most mature aspect-oriented tool available at the time this project was being undertaken is AspectJ, which is an extension of Java. AspectJ can be used to write an aspect to a separate concern in a sequential program to avoid code tangling, but it is often inapplicable for concurrent programs. The problem lies in the fact that the points where parallelisation should occur are not natural join points in AspectJ (i.e. points where AspectJ can intervene). Consequently, this thesis proposes a set of fine-grained join points capable of completely handling concurrent programs. This model goes beyond present AspectJ models and demonstrates the need to recognise complex behaviour for an effective separation of concerns.Finally, aspects for implementing concurrent programs according to different schemes are presented, together with evaluation results. This highlights the flexibility of aspects for implementing concurrent programs, a flexibility which is always a cross-cutting concern with respect to the main concern of base applications.