【发布时间】:2012-03-15 13:33:55
【问题描述】:
好的,我承认我是 Java 线程的新手,我一直在阅读有关 java.util.concurrent 的大量内容,并且有一些问题希望真人能够回答。
首先,我创建了 ThreadPoolExecutor 和 BlockQueue 来帮助运行我的 Runnable/Callable 方法。为了使事情变得简单,我的知识有限,我将所有活动限制为只读,没有修改传递给 Runnable 的对象,并且创建的信息是从数据库中提取的,应用程序使用它来填充 GUI 表,任何信息都在数据库可以在接收之前或之后进行更改,这与显示目的无关。
我很好奇的是我所做的是否是线程安全的。我已经扩展了 ThreadPoolExecutor,所以我可以重写 afterExecute 方法以在 Runnable 完成线程中的工作后执行它。从我的阅读来看,这个操作似乎是在主线程中完成的,并且被认为是线程安全的。
同样继续这个想法,如果我在这个 Runnable/Callable 类中编写另一个方法并直接使用它而不使用它也将在主线程上运行的 run(或 ThreadPoolExecutor.execute())注意安全。问题二:如果我从 Runnable 类的 run() 方法中使用这个方法,它是在线程上运行的吗? (我假设是,并要求确认)如果我直接运行这个方法,它会在主线程上运行吗?
原因是因为我希望将与查询/更新/插入有关的所有内容保留在一个类中,但在主线程中保留对数据库的更新。
一些代码帮助解释:
扩展的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 类:
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
}
}
其他一些调用 doSomething() 的类:
public class someOtherClass {
public SomeOtherClass(Runnable someRunnable) {
someRunable.doSomething();
}
}
【问题讨论】:
-
你说的“主线程”是指Swing/AWT事件线程吗?
-
用一点代码更容易回答。
-
标题中的Callable是从哪里来的?
-
打算使用 Callable 来返回未来,或者只是使用 runnable 来填充对象并在执行后使用数据......在这种情况下,Callable 和 Runnable 与 .afterExecute 相同...抱歉,我没有再次提及 Callable。
标签: java concurrency