java中多线程的并行执行
我必须同时执行类的多个实例。我在下面编写了以下代码。我用两种方法做了这件事。但我看不出有什么区别。有并行运行线程的正确方法是什么 谢谢 下面是代码片段:java中多线程的并行执行,java,multithreading,Java,Multithreading,我必须同时执行类的多个实例。我在下面编写了以下代码。我用两种方法做了这件事。但我看不出有什么区别。有并行运行线程的正确方法是什么 谢谢 下面是代码片段: public class MyClass { public MyClass() { runnable = true; } public boolean isRunnable() { return runnable; }
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(){
.........
}
}
}
公共类MyClass{
公共MyClass(){
runnable=true;
}
公共布尔值不可命名(){
返回可运行;
}
公共静态void main(字符串[]args)引发InterruptedException{
/*方法1
MyClass MyClass=新的MyClass();
if(myclass.isRunnable()){
for(int i=0;i
两种方法的区别在于,在“方法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(); });
}
ExecutorService线程池=Executors.newFixedThreadPool(threadNo);
for(int i=0;i
并行或并行?顺便说一句:myclass.execTask;
什么都不做-您至少应该使用myclass.execTask()
。更正。感谢您指出。这样我就可以取消睡眠?如果我只循环一次,我只看到一个任务正在执行。我仍然认为线程池提交将同时启动所有“threadNo”线程。我编辑了答案,使方法2的正确使用更加清晰。谢谢。只是想弄清楚,一个人何时想要有几个线程“可运行的"任务?当Runnable为1时,所有线程竞争执行一个Runnable,只有一个线程可以执行?当对ExecutTask
的每次调用都执行一项独立的工作时,您希望使用这种多线程。通过将这些工作放在队列中并允许它们同时工作,您应该能够比一次只执行一个任务更快地完成这些任务。execTask实际上会执行一些文件处理。我是否可以确保对文件的访问是互斥的?