マルチスレッドコードから複数のスレッドを生成するプロジェクトに取り組んでいます。
10 個のスレッドを生成すると仮定すると、各スレッドが特定の期間実行されていることを確認する必要があります。
たとえば、each thread
実行する必要がある場合30 minutes
は、config.properties
ファイルで、次のようになりますTOTAL_RUNNING_TIME=30
そこで、各スレッドが実行されていることを確認するために、以下の設計を思いつきました30 minutes
。
private static long durationOfRun;
private static long sleepTime;
public static void main(String[] args) {
// create thread pool with given size
ExecutorService service = Executors.newFixedThreadPool(threads);
try {
readPropertyFile();
for (int i = 0; i < threads; i++) {
service.submit(new ReadTask(durationOfRun, sleepTime));
}
}
}
private static void readPropertyFile() throws IOException {
prop.load(Read.class.getClassLoader().getResourceAsStream("config.properties"));
threads = Integer.parseInt(prop.getProperty("NUMBER_OF_THREADS"));
durationOfRun = Long.parseLong(prop.getProperty("TOTAL_RUNNING_TIME"));
sleepTime = Long.parseLong(prop.getProperty("SLEEP_TIME"));
}
以下は私の ReadTask クラスです。
class ReadTask implements Runnable {
private long durationOfRun;
private long sleepTime;
public ReadTask(long durationOfRun, long sleepTime) {
this.durationOfRun = durationOfRun;
this.sleepTime = sleepTime;
}
@Override
public void run() {
long startTime = System.currentTimeMillis();
long endTime = startTime + (durationOfRun*60*1000);
//Each thread is running less than endTime
while(System.currentTimeMillis() <= endTime) {
//Do whatever you want to do
}
Thread.sleep(sleepTime);
}
}
私の run メソッドを見ると、時間をチェックする while ループがあります。では、各スレッドを特定の期間実行するというこのアプローチは正しいですか? それとももっと良い方法もありますか?他のより良いアプローチがある場合、またはこれも目的に役立つ場合は、私の無知を無視してください。
ここにもスレッドセーフの問題があるかどうか教えてください。
私が探しているのは、各スレッドが 30 分間実行され、そのスレッドの時間が終了した場合は、現在実行中のタスクを完了し、その後shutdown
はExecutorService
. これよりも優れたアプローチまたは優れた設計があれば。私の知識の観点からそのことを学ぶことができるように、いくつかの例を教えてください。助けてくれてありがとう。
アップデート:-
run メソッドの while ループを調べると、その while ループ内でSelect call to the database
. だから私が探しているのはこのようなものです-そのスレッドの時間が終了するとすぐに、データベースへの他の選択呼び出しを行わず、以前に行っていたことをすべて終了します。のようにshutdown
動作しExecutorService
ます。
そして、私はこのシナリオを望んでいません-そのスレッドの時間が終了するとすぐに、可能な限りスレッドをタイムアウトさせます。その特定のスレッドはその期間にデータベースへの選択を行っていましたか?