The Welshman claimed the victory 11 seconds ahead of Belgian Victor Campenaerts (Lotto-Soudal), who had enjoyed a long spell in the hot seat after setting an early fast time on the undulating 20.3-kilometre route starting and finishing in Lagoa.
Stefan Küng (BMC Racing) placed third, with the previous day’s stage winner, Michal Kwiatkowski (Team Sky) putting in another strong ride to finish fourth.
Former time trial world champions Tony Martin (Katusha-Alpecin) and Vasil Kiryienka (Team Sky) finished sixth and ninth respectively.
“It’s nice to get a win. Like I said yesterday, I just didn’t expect it. It all seemed to click today,” Thomas said after the victory.
Having already won the race in 2015 and 2016, Thomas said he was keen to add a third victory.
“We’ll try and keep the race lead now, we’ll have a look at the time gaps but not take anything for granted. Victories are few and far between, so I will enjoy this.”
Thomas said that he is off to Tenerife after the race finishes for a team training camp, before staring his campaign in northern Europe.
Thomas now leads team-mate Kwiatkowski by 22 seconds overall, with Portuguese rider Nelson Oliveira (Movistar) in third at 32 seconds.
The 2018 Volta ao Algarve continues on Saturday with stage four, a relatively flat trip from Almodôvar to Tavira taking in 199.2km. The UCI 2.HC-ranked race concludes on Sunday, February 18.
Volta ao Algarve 2018, stage three: Lagoa to Lagoa, 20.3km
1. Geraint Thomas (GBr) Team Sky, in 24-09
2. Victor Campenaerts (Bel) Lotto-Soudal, at 11 secs
3. Stefan Küng (Sui) BMC Racing, at 19 secs
4. Michal Kwiatkowski (Pol) Team Sky, at 22 secs
5. Nelson Oliveira (Por) Movistar, at 22 secs
6. Tony Martin (Ger) Katusha-Alpecin, at 27 secs
7. Tejay van Garderen (USA) BMC Racing, at 47 secs
8. Bob Jungels (Lux) Quick-Step Floors, at 49 secs
9. Vasil Kiryienka (Blr) Team Sky, at 50 secs
10. Lukasz Wisniowski (Pol) Team Sky, at 51 secs
General classification after stage three
1. Geraint Thomas (GBr) Team Sky, in 10-01-58
2. Michal Kwiatkowski (Pol) Team Sky, at 22 secs
3. Nelson Oliveira (Por) Movistar, at 32 secs
4. Bob Jungels (Lux) Quick-Step Floors, at 52 secs
5. Tejay van Garderen (USA) BMC Racing, at 53 secs
6. Bauke Mollema (Ned) Trek-Segafredo, at 1-01
7. Jaime Roson (Esp) Movistar, at 1-18
8. Maximilian Schachmann (Ger) Quick-Step Floors, at 1-19
9. Felix Großschartner (Aut) Bora-Hansgrohe, at 1-20
10. Vasil Kiryienka (Blr) Team Sky, at 1-24