在Java中运行3个线程并等待

在Java中运行3个线程并等待,java,multithreading,Java,Multithreading,我正在尝试编写一个一次只能运行X(比如说3)个线程的类。我有8个线程需要执行,但我只想让3个线程同时运行,然后等待。一旦当前运行的一个线程停止,它将启动另一个线程。我不太清楚怎么做。我的代码如下所示: public class Main { public void start() { for(int i=0; i<=ALLTHREADS; i++) { MyThreadClass thread = new MyThreadClass(someParam, someP

我正在尝试编写一个一次只能运行X(比如说3)个线程的类。我有8个线程需要执行,但我只想让3个线程同时运行,然后等待。一旦当前运行的一个线程停止,它将启动另一个线程。我不太清楚怎么做。我的代码如下所示:

public class Main {
  public void start() {
    for(int i=0; i<=ALLTHREADS; i++) {
      MyThreadClass thread = new MyThreadClass(someParam, someParam);
      thread.run();

      // Continue until we have 3 running threads, wait until a new spot opens up.  This is what I'm having problems with
    }
  }
}

public class MyThreadClass implements Runnable {
  public MyThreadClass(int param1, int param2) {
    // Some logic unimportant to this post
  }

  public void run() {
    // Generic code here, the point of this is to download a large file
  }
}
公共类主{
公开作废开始(){

对于(int i=0;i除非这是作业,否则您可以使用
Executors.newFixedThreadPool(3)
,它返回一个
ExecutorService
,最多3个线程来执行
Runnable
任务。

除非这是作业,否则您可以使用
Executors.newFixedThreadPool(3)
返回一个
ExecutorService
,最多有3个线程来执行
可运行的任务。

您应该在这里使用线程池机制来运行多个线程

为了方便起见,我们可以使用java中的线程池执行器,这非常简单

使用executors方法创建3个线程的固定池

为8次迭代编写一个for循环,并在每个线程上调用execute,它一次只运行3个线程

ExecutorService executor = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 8; i++) {
             Task task = new Task(someParam, someParam);
            executor.execute(task);
          }
        executor.shutdown();
ExecutorService executor=Executors.newFixedThreadPool(3);
对于(int i=0;i<8;i++){
任务任务=新任务(someParam,someParam);
执行者。执行(任务);
}
executor.shutdown();

您应该在这里使用线程池机制来运行多个线程

为了方便起见,我们可以使用java中的线程池执行器,这非常简单

使用executors方法创建3个线程的固定池

为8次迭代编写一个for循环,并在每个线程上调用execute,它一次只运行3个线程

ExecutorService executor = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 8; i++) {
             Task task = new Task(someParam, someParam);
            executor.execute(task);
          }
        executor.shutdown();
ExecutorService executor=Executors.newFixedThreadPool(3);
对于(int i=0;i<8;i++){
任务任务=新任务(someParam,someParam);
执行者。执行(任务);
}
executor.shutdown();

不,不是家庭作业,只是做一个小项目学习:)谢谢,我会试试:)@user2229544你还应该记住,除了你创建的线程之外,JVM还可以自己运行几个线程。不,不是家庭作业,只是做一个小项目来学习:)谢谢,我会试试:)@user2229544你还应该记住,除了线程之外,你创建的JVM还可以自己运行几个线程。(几乎)完美答案。改进建议:将“MyThreadClass”重命名为“Task”,将“thread”重命名为“Task”,以明确区分任务(要运行的对象)和线程(如何运行对象)@isnot2bad:我已经完成了建议的更改并更新了答案…感谢您的建议..值得注意的是,这将总共有4个线程。3个执行线程和最初的一个(不会做太多)(几乎)完美的答案。改进建议:将“MyThreadClass”重命名为“Task”,将“thread”重命名为“Task”为了清楚地区分任务(要运行的东西)和线程(如何运行东西)。@isnot2bad:我已经完成了建议的更改并更新了答案…感谢您的建议..值得注意的是,这将总共有4个线程。3个执行器线程和初始线程(不会做太多)您应该将MyThreadClass重命名为其他名称:它不是线程。示例中的代码不创建任何线程:它所做的只是在程序的主线程中多次串行调用run()方法。如果要创建新线程,必须创建一个新线程对象并调用其start()方法,否则必须调用将为您执行此操作的库例程(例如,如下所示)。您应该将MyThreadClass重命名为其他名称:它不是线程。示例中的代码不创建任何线程:它所做的只是串行调用run()方法在程序的主线程中执行多次。如果要创建新线程,必须创建新线程对象并调用其start()方法,否则必须调用将为您执行此操作的库例程(例如,如下所示)。