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实际上会执行一些文件处理。我是否可以确保对文件的访问是互斥的?