ちなみに過去に作ったプログラムではこうしていたよ。
メイン処理を半無限ループでぶん回す昔ながらのやりかた。
その1は実行環境によって極端な誤差が出でしまうんだ。

その1
 スレッド1 while(終了条件){メイン処理;wait();}
 スレッド2 while(終了条件){wait(33);notify();}

その2
 while(終了条件){
  メイン処理;
  sleep(待ち時間);
  if(1秒に1回){
   直前の1秒間の描画回数をチェックして待ち時間を調整;
  }