当前位置: 首页 > 知识库问答 >
问题:

如何在java中多次运行一个线程[重复]

臧梓
2023-03-14

这里我用java开发。

我有一个for循环中的线程,我想连续运行5次。不幸的是,循环在第二次运行时停止,出现了一个错误:

异常在线程"main"java.lang.IllegalThreadStateExctive在java.base/java.lang.Thread.start(Thread.java:793)

我知道这个错误是什么意思,但是我要求他在确定完成线程时恢复循环,这样就不会有任何错误。为此,我使用线程类的. add()方法

exl:-启动循环-执行线程...-确保你完成了线程-然后花费循环-再次执行线程...-确保你完成了线程-然后花费循环-再次执行线程...等等。


public class Debut {

    public static void main(String... arg) {

        for (int b = 0; b <= 5; b++) {

            System.out.println(" loop number " + b );

                try {
                    System.out.println("start..............of thread ");
                    monThread.start();
                    monThread.join();
                    System.out.println("end..............of thread ");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    System.out.println(e.getMessage());
                }
    
        }

    }




    static Thread monThread = new Thread(new Runnable() {
        @Override
        public void run() {

            int a = 0;

            for (a = 0; a < 10; a++) {
                System.out.println("downloard  " + a + " sujet");
            }

            System.out.println("end of downloard  " + a + " sujet");
        }
    });

}

我希望它能这样工作

exl:-启动循环-执行线程...-确保你完成了线程-然后花费循环-再次执行线程...-确保你完成了线程-然后花费循环-再次执行线程...等等。

我用了。thread类的join()方法,以便循环在重新运行线程之前等待线程结束。

共有3个答案

曾鸿振
2023-03-14

正如其他人所说,一个线程完成,你不能再次运行=

public class Debut {

  public static void main(String... arg) {

    for (int b = 0; b <= 5; b++) {

      System.out.println(" loop number " + b);

      try {
        System.out.println("start..............of thread ");
        Thread monThread = new Thread(new MonRunnable());
        monThread.start();
        monThread.join();
        System.out.println("end..............of thread ");
      } catch (Exception e) {
        e.printStackTrace();
        System.out.println(e.getMessage());
      }

    }

  }

  static class MonRunnable implements Runnable {
    @Override
    public void run() {
      try {
        Thread.sleep(5000);
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }

      int a = 0;

      for (a = 0; a < 10; a++) {
        System.out.println("downloard  " + a + " sujet");
      }

      System.out.println("end of downloard  " + a + " sujet");
    }
  }
}
吴欣悦
2023-03-14

已终止的线程无法再次运行。时期

我知道这个错误是什么意思,

呃。。。

但我要求他在确定完成线程后恢复循环,以免出现任何错误。为此,我使用thread类的join()方法。

... 不,你不知道这到底意味着什么。它真正的意思是不能重新启动已终止的线程。不使用join()或任何其他方法。

我可以想到三种方法来解决这个问题:

>

  • 用原来的Runnable对象创建一个新线程,并启动它。重复5次。

    更改Runnable,使其执行任务5次;i、 e.将循环置于可运行模式中。run()方法。

    使用ExecutorService并将Runnable提交给它5次。根据您试图实现的目标,您可以使用带有单个线程的执行器,也可以使用带有5个线程的执行器。

    在每种情况下,测量和记录“成本”都应该在Runnable中完成。或者在第三种情况下,您可以使用可调用,这样您就可以通过提交(…)返回的未来返回一个值

  • 颛孙兴旺
    2023-03-14

    线程只能生存一次,所以当你运行一个线程并完成时,同一个实例就不能再运行了——它已经死了。必须创建Thread类的新实例。但看起来,您希望在一个单独的线程中执行同一任务5次。为此,您需要创建一个类,该类不扩展Thread,而是实现接口Runnable,然后使用类执行器创建一个线程池(请参见接口执行器服务),并在循环中提交任务。因此,您的代码可能如下所示:

        MyRunnable myRunnable = new MyRunnable()    
        ExecutorService pool = newSingleThreadExecutor();
        for (...) {
          pool.execute(myRunnable);
        }
    
     类似资料:
    • 我试着运行一个程序,使用线程显示带有数字的乘法、除法、加法和减法表。 但是我希望数字被乘以或相加等。由用户选择。 也就是说,程序应该在用户为每个操作选择一个数字后运行,然后显示结果。

    • 在我的应用程序中,在程序的整个生命周期中,有n个操作必须依次发生。我决定为每个操作创建一个线程,让它们执行一次run方法,然后等待所有其他线程都执行相同的操作,等待轮到它,然后再次执行,依此类推,而不是创建实现这些操作的方法并在while(true)循环中按顺序调用它们。。。 为了实现这个机制,我创建了一个名为StatusHolder的类,它有一个名为threadTurn的字段(表示应该执行哪个线

    • 问题内容: 我想依次运行每个选定的py.test项目任意次。 我没有看到任何标准的py.test机制来执行此操作。 我试图做到这一点。我修改了传入的项目列表,以多次指定每个项目。测试项目的第一次执行可以按预期工作,但是这似乎对我的代码造成了一些问题。 此外,我希望每次运行都具有唯一的测试项目对象,因为我在各种报告代码中都使用id(项目)作为键。不幸的是,我找不到任何py.test代码来复制测试项目

    • 问题内容: 我有一个绝妙的主意,可以加快生成36个文件所需的时间:使用36个线程!不幸的是,如果我使用36个线程/会话启动一个连接(一个连接对象),那么与每次执行每个线程相比,所有事情的滞后性更大。 现在,如果我尝试创建36个新连接(36个连接对象),则每个线程都有一个单独的服务器连接,要么我退出内存异常(以某种方式程序仍然运行,并成功结束工作,但速度比我慢依次执行一个线程)。 那么该怎么办?如何

    • 问题内容: 我有一个使用两个线程的程序。我已经在两个线程中都设置了断点。在gdb下运行程序时,我想在线程之间切换并使其运行。(线程t1是活动的并且正在运行,线程t2;在断点处暂停时。我想停止T1的运行并运行T2)。 有什么办法可以安排gdb中的线程? 问题答案: 如果您使用的是GDB 7或更高版本,请尝试“不间断模式”。 http://sourceware.org/gdb/current/onli

    • 我正在php上研究多对多关系,我有3个表,包括电影名称和电影id的movie表genre表包括类型和类型id的movie_genre表包括电影id和类型id的movie_genre表 genre表有这些值 我使用下面的代码来获取数据 但结果将类似于 movie_id movie_name genre[1] movie_id movie_name genre[2] movie_id movie_na