我必须同时执行我的类的多个实例。我在下面写了下面的代码。我是以两种方式完成的。但我没有看到差异。并行运行线程的正确方法是什么?
感谢。
这里是片段:
public class MyClass {
public MyClass() {
runnable = true;
}
public boolean isRunnable() {
return runnable;
}
public static void main(String[] args) throws InterruptedException {
/* METHOD 1
MyClass myclass = new MyClass();
if (myclass.isRunnable()) {
for (int i = 0; i < loop; i++) {
myclass.execTask();
Thread.sleep(sleep);
}
}
*/
//METHOD 2
final MyClass myclass = new MyClass();
ExecutorService threadPool = Executors.newFixedThreadPool(threadNo);
for (int i = 0; i < threadNo; i++) {
threadPool.submit(new Runnable() {
public void run() {
for (int i = 0; i < loop; i++) {
myclass.execTask();
try {
Thread.sleep(sleep);
} catch (InterruptedException ex) {
Logger.getLogger(MyClass.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
});
}
threadPool.shutdown();
public void execTask(){
.........
}
}
}
答案 0 :(得分:5)
两种方法之间的区别在于,在“方法2”中,您实际上可能有多个执行线程(假设threadNo
大于1)。方法2允许多个工作线程同时抓取Runnable
并调用execTask
(通过调用run
)(同时,准确地说)。 “方法2”中的暂停几乎没有任何作用。
“方法1”完全在“主”线程上执行。它调用execTask
,等待,然后再次调用它。这将连续多次调用执行。
(我假设这是伪代码,因为它的一部分不会编译。)
这是一个清理过的“方法2”。请注意,我有threadNo
个工作线程(如果大于1,则会有帮助)并创建loop
Runnables
。
ExecutorService threadPool = Executors.newFixedThreadPool(threadNo);
for (int i = 0; i < loop; i++) {
threadPool.submit(new Runnable() {
public void run() { myclass.execTask(); });
}