The book you want is here: http://mitpress.mit.edu/sicp/
I'd take this a step further and expand your knowledge with a sense of breadth too. Suppose you currently only know Java, it's far more useful to learn something completely different, e.g. Lisp/Clojure or Prolog than it would be to learn C#.
The broader one's background the easier it is to pick up anything new along the way, and if there's one fact of life as a developer, there'll always be knew things to learn along the way.
However it would be good to have a look at a few other books for leading languages like Erlang, Scala, Python and see if something other language or author fits your way of thinking better.
Because the most important thing is to get into the groove of learning at a pace that you can sustain for several years. It will take years to master the craft.
Go forth and learn, if you want. But language doesn't matter, it's what you do and how you do it that counts.
All languages are a means to an end, through various routes and with various properties. Some are better suited to one set of problems than another.
Java may not be the most elegant language (to put it mildly) but it's a solid one and it gives you some interesting long term options such as to use your knowledge of the Java runtime and libraries by adding Clojure.
If you want to become a better programmer, to be flexible enough to write whatever software needs to be written over the next couple of decades, then diversity is important. Learn a Lisp. Learn a scripting language like Perl. Learn something low-level, like C or C++. Learn a line of business language like Java or C#.
Most software doesn't require mastery of a specific language, and having a broad background will mean you can adapt to whatever the future decides is 'in'. Learn a bit of everything.
Edit: Don't learn COBOL.