The 34-year-old heads into the 10.1km coastal race against the clock on Monday in third spot – 39 secs down on race leader Simon Yates.
Thomas lies third overall 23 secs adrift of Rafa Majka after the trio all crossed the line in the same time on Sunday’s penultimate stage.
“It was almost like a Junior race today, attacks everywhere from the start. It took a long time for the break to go, and then attacks where flying in the final again,” said the Ineos Grenadiers rider of the lumpy 181km stage from Pieve Torino to Loreto.
“But it was hard to make a difference on the laps, but I stayed in a good position in the front, so it all looks good heading into the TT.”
Thomas – returning to form as his successor as Tour de France champ Egan Bernal was seeing his hold on the Yellow Jersey slip from his grasp on Sunday – finished eighth on the stage.
Given Bernal’s problems, Thomas can only wonder what might have been if he had been given the nod for Le Tour by team chief Dave Brailsford.
Thomas will instead bid for the Giro d’Italia title next month.
The Cardiff-born rider was part of a peloton that grew gradually smaller on the undulating course, being assisted by Chris Froome, Tao Geoghegan Hart and Salvatore Puccio
Mathieu van der Poel (Alpecin – Fenix) won the stage ahead of Ruben Guerreiro (EF Pro Cycling) and Matteo Fabbro (Bora – Hansgrohe).
1 – Mathieu van der Poel (Alpecin – Fenix) 181km in 4h19’23”
2 – Ruben Guerreiro (EF Pro Cycling) at 4″
3 – Matteo Fabbro (Bora – Hansgrohe) s.t.
8 – Geraint Thomas (Team Ineos) at 10″
1 – Simon Yates (Mitchelton – Scott)
2 – Rafal Majka (Bora – Hansgrohe) at 16″
3 – Geraint Thomas (Team Ineos) at 39″
4 – Aleksandr Vlasov (Astana Pro Team) at 49″
5 – Fausto Masnada (Deceuninck – Quick-Step) at 57″