Das Quellgebiet der Dünnern befindet sich auf rund 760 m ü.M. auf dem Gemeindegebiet von Gänsbrunnen. Die Dünnern fliesst anschliessend nach Ostnordosten durch die Talsenke von Welschenrohr und erhält dabei Zuflüsse von mehreren kleinen Bächen, die an den Hängen der umgebenden Jurahöhen entspringen und sich teilweise tief in die harten Kalkschichten der Juraketten eingegraben haben.
Östlich von Welschenrohr strömt die Dünnern durch eine Talenge und erreicht danach die weite Talebene des Balsthaler Tals (auch Dünnerntal genannt). Bei Balsthal mündet mit dem Augstbach der wichtigste Seitenbach der Dünnern, der den östlichen Teil des Balsthaler Tals entwässert, in die Dünnern. Anschliessend macht diese einen Bogen nach Südosten und durchbricht die erste Jurakette mit der Balsthaler Klus, einer charakteristischen Juraklus. Es wird davon ausgegangen, dass die Balsthaler Klus nicht ausschliesslich aufgrund von Erosion der Dünnern entstanden sein kann, sondern dass hier schon vor dem Wirken des Flüsschens eine geologische Störung in Form eines Einschnitts bestand, der dann durch die Dünnern auf weniger als 500 m ü.M. vertieft wurde. Die ursprüngliche Störung ist auf die Jurafaltung zurückzuführen.
Bei Oensingen öffnet sich die Klus, und die Dünnern tritt in das Schweizer Mittelland hinaus und fliesst parallel zur Jurakette und entlang der Autobahn A1. Hier ist die Dünnern weitgehend begradigt und hart verbaut. Es bestehen aber aktuell im Rahmen des Hochwasserschutzes Bestrebungen zur Revitalisierung.
Im Bereich von Hägendorf, wo der Cholersbach zufliesst, verengt sich die Ebene; die Dünnern wird in ihrem untersten Abschnitt im Norden von der Jurakette, im Süden vom Höhenrücken des Born flankiert.
Bei Olten fliesst die Dünnern über Stufen im Felsuntergrund von der Gäuebene zur Aareniederung hinunter; das beträchtliche Gefälle diente seit dem Mittelalter für den Antrieb von Wasserwerken mehrerer Gewerbebetriebe. Südlich der Altstadt von Olten mündet der Fluss dann in die Aare.