私はJavaのスレッディングについては新しいことを認めますが、私はjava.util.concurrentについて多くの読書をしています。私は本当の人が答えることを望んでいました。スレッドの質問 - java.util.concurrent - Runnable/Callable
まず、Runnable/Callableメソッドの実行に役立つThreadPoolExecutorとBlockQueueを作成しました。私の限られた既知のものを単純に保つために、私はすべてのアクティビティを読み取り専用に制限し、Runnableに渡されたオブジェクトは変更されず、作成された情報は、アプリケーションがGUIテーブルを作成するために使用するデータベースデータベースは受信前または受信後に変更できますが、表示目的には関係ありません。
私が興味深いのは、スレッドセーフであることです。 ThreadPoolExecutorを拡張したので、スレッドで作業が終了した後にRunnable内のメソッドを実行するためにafterExecuteメソッドをオーバーライドできます。私が読んだところでは、この操作はメインスレッドで行われ、スレッドセーフであると考えられます。
また、この考え方を続けると、このRunnable/Callableクラス内にある別のメソッドを記述し、run(またはThreadPoolExecutor.execute())を使わずに直接使用すると、メインスレッドでも実行されますそして安全です。質問2:Runnableクラスのrun()メソッドからこのメソッドを使用すると、スレッド上で実行されますか? (私はそれを仮定し、確認を求める)と私は直接このメソッドを実行する場合は、メインスレッド上で実行されるだろうか?
理由は、1つのクラス内でクエリ/更新/挿入と関係がありますが、メインスレッドのデータベースを更新する必要があるためです。
説明するためのコードのビット:
拡張ThreadPoolExecutor:
public class DatabaseThreadPoolExecutor extends ThreadPoolExecutor {
public DatabaseThreadPool(int corePoolSize, int maximumPoolSize, long keepAlive, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(//pass info to super)
}
protected void afterExecute(Runnable runnable, Throwable throwable) {
if(runnable instanceof someRunnable) {
((SomeRunnable) runnable).afterExecution();
}
}
}
のRunnableクラス:doSomethingのを呼び出し
public class someRunable implements Runable {
public someRunnable() {
// used code withing thread
}
public doAfterExecute() {
// run by ThreadPoolExecutor .afterExecute()
}
public doSomething() {
// Run by someRunnable in thread
// Also run directly by some other class
}
}
他のクラス():
public class someOtherClass {
public SomeOtherClass(Runnable someRunnable) {
someRunable.doSomething();
}
}
「メインスレッド」と言うときは、Swing/AWTイベントスレッドを参照していますか? –
少しのコードで簡単に答えることができます。 – moodywoody
タイトルのCallableはどこに入っていますか? – kylewm