Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 只有一个线程从大小为5的ExecutorService newFixedThreadPool运行_Java_Multithreading - Fatal编程技术网

Java 只有一个线程从大小为5的ExecutorService newFixedThreadPool运行

Java 只有一个线程从大小为5的ExecutorService newFixedThreadPool运行,java,multithreading,Java,Multithreading,我正在尝试学习ExecutorService newFixedThreadPool的行为。我将工作分配给executorService,并希望它由多个线程完成 情况很简单 我初始化大小为5的线程池。然后我把工作分配给执行服务。 但我看到只有一个线程正在处理这项工作 它不应该由池中多个可用线程处理吗。 代码: 我期望的结果是: 更多线程参与工作 编辑 本质上,我希望使用ExecutorService复制此行为 package Threading; public class ThreadDelet

我正在尝试学习ExecutorService newFixedThreadPool的行为。我将工作分配给executorService,并希望它由多个线程完成

情况很简单

我初始化大小为5的线程池。然后我把工作分配给执行服务。 但我看到只有一个线程正在处理这项工作

它不应该由池中多个可用线程处理吗。 代码:

我期望的结果是:

更多线程参与工作

编辑

本质上,我希望使用ExecutorService复制此行为

package Threading;

public class ThreadDeleteme {
    public static void main(String[] args) {
        Work w = new Work();
        Thread t1 = new Thread(w);
        t1.setName("Thread 1 ");
        Thread t2 = new Thread(w);
        t2.setName("Thread 2 ");
        Thread t3 = new Thread(w);
        t3.setName("Thread 3 ");
        t1.start();
        t2.start();
        t3.start();
        System.out.println("ThreadDeleteme.main()");
    }

}

class Work implements Runnable {
    Integer i = 0;

    @Override
    public void run() {
        while (i < 100) {
            System.out.println(Thread.currentThread().getName() + " " + i);

                i++;
            }
    }
}
你能告诉我我的理解哪里出错了吗


感谢您创建了一个线程,该线程将当前线程名=活动线程池-1-thread-1打印5次。 创建5个可运行实例并将其提交给executor服务

[更新]

public class Main {
    public static void main(String[] args) {
        Work w = new Work();
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        executorService.submit(w);
        executorService.submit(new Work()); // set new runnable tasks here
        executorService.submit(new Work());
        System.out.println("ThreadDeleteme.main()");

    }

}

class Work implements Runnable {
    Integer i = 0;

    @Override
    public void run() {
        while (i < 100) {
            System.out.println(Thread.currentThread().getName() + " " + i);
            i++;
        }
    }
}
关于命名问题, 您必须使用ExecutorService实现,该实现允许您设置用于创建线程的ThreadFactory,并传递一个使用适当名称创建线程的实例。

您使用相同的线程打印循环,但没有使用不同的线程调用方法,线程不会自动划分任务,您必须将任务分配给它们

public static void main(String[] args){

     ExecutorService executorService = Executors.newFixedThreadPool(5); //here you defined thread pool size
     executorService.submit(new Work()); //added first thread to pool
     executorService.submit(new Work()); //added second thread
     executorService.submit(new Work()); //added third thread
 }
还有你的工作班:

class Work implements Runnable {
int i = 0;

@Override
public void run() {
    while (i < 100) {
        System.out.println(Thread.currentThread().getName() + " " + i);

            i++;
        }
}

}

您需要创建多个任务,而不是只创建一个任务。因此,下面的内容应该适合您。但是,如果任务完成得比创建另一个任务快,那么在任何情况下,它都可能不会命中所有线程

   ExecutorService executorService = Executors.newFixedThreadPool(5);

    int k =0;
    while (k++<5){
        executorService.execute(new Runnable() {
             public void run() {
                 System.out.println("Active Thread "+Thread.currentThread().getName());
        });
      }
 };

您没有给池5个任务,而是给了它一个循环5次的任务;executor.executenew RunnableTask1;executor.executenew RunnableTask2;你能检查一下我修改过的问题吗。我希望我的单个工作由线程池中的多个线程完成。就像我在编辑部分executor.executet1中所做的那样;您将相同的任务分配给线程,这显然是错误的,而且不安全。为每个线程创建一个新的工作对象,然后所有三个线程都将执行从0到100的相同循环。请检查我修改的问题。我希望我的单个工作由线程池中的多个线程完成。就像我在编辑区做的一样,你能检查一下我修改过的问题吗。我希望我的单个工作由线程池中的多个线程完成。就像我在编辑中所做的那样section@Geek您编辑的代码在其当前形式中没有意义。所有线程都在访问同一个对象,这将导致并发问题。而且,你的例子太简单了。通常,您必须将问题分解为更小的子问题,这是threadpool不能为您做的事情。如果你展示了你真正想要并行化的东西,这会更容易。@Geek是的,你的“更新”行为将类似于你提供的“线程”示例。你也可以用同样的“工作”。但这是一个非常简单且不太有用的例子。在现实世界中,您还需要注意线程之间的同步和对数据的并发访问。。。。在您的情况下,EexcurtorService会将处理任务的线程数限制为5个,在线程示例中,没有任何东西可以做到这一点。您只计划执行3个任务,因此在任何情况下都会浪费2个线程。
class Work implements Runnable {
int i = 0;

@Override
public void run() {
    while (i < 100) {
        System.out.println(Thread.currentThread().getName() + " " + i);

            i++;
        }
}
   ExecutorService executorService = Executors.newFixedThreadPool(5);

    int k =0;
    while (k++<5){
        executorService.execute(new Runnable() {
             public void run() {
                 System.out.println("Active Thread "+Thread.currentThread().getName());
        });
      }
 };