Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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 线程循环_Java_Multithreading - Fatal编程技术网

Java 线程循环

Java 线程循环,java,multithreading,Java,Multithreading,考虑以下两种run方法的设计: 接近A public void run() { do { //do something } while (condition); } 方法B public void run() { //do something... if (condition) { new Thread(this).start(); } } 第二种方法对我来说似乎更干净,经过一些讨论,我被告知使用第二种方法不是一个好主

考虑以下两种
run
方法的设计:

接近A

public void run() {
    do {
        //do something
    } while (condition);
}
方法B

public void run() {

    //do something...

    if (condition) {
       new Thread(this).start();
    }
}
第二种方法对我来说似乎更干净,经过一些讨论,我被告知使用第二种方法不是一个好主意

问题:

  • 我不应该使用方法2的原因(如果有)是什么
    因为方法B比方法A多使用一个线程。创建线程的成本很高,原因有很多@see


    我认为,方法A对读者来说也更清晰。最简单的选择通常是。

    因为方法B比方法A多使用一个线程。创建线程的成本很高,原因有很多@see


    在我看来,方法A对读者来说也更清晰。最简单的选择通常是。

    这里有两件事。一个循环和一个方法,它在新线程中不断地再次运行自己,直到满足一个条件(不是循环)

    如果您需要一个循环,您可以选择每个人都能理解并完美工作的标准正常循环

    如果您需要编写一段奇怪的代码,无缘无故地创建新线程,并使其他开发人员怀疑您的技能和理解能力,您可以选择选项B


    您的选择B完全没有意义,除非重新调用该方法时会涉及队列或ThreadPoolExecutor之类的附加内容,因此该方法会在末尾添加
    ,以便稍后调用,有点像“惰性循环”。

    这里有两件事。一个循环和一个方法,它在新线程中不断地再次运行自己,直到满足一个条件(不是循环)

    如果您需要一个循环,您可以选择每个人都能理解并完美工作的标准正常循环

    如果您需要编写一段奇怪的代码,无缘无故地创建新线程,并使其他开发人员怀疑您的技能和理解能力,您可以选择选项B


    您的选择B完全没有意义,除非重新调用该方法时会涉及队列或ThreadPoolExecutor之类的附加内容,因此该方法会在末尾添加
    ,以便稍后调用,有点像“惰性循环”.

    对于模式B,我能找到的唯一好的用例是,在您想要重新运行该方法之前,是否存在明显的延迟。例如,对于某种轮询系统,在系统关闭之前,该系统应每X分钟运行一次

    在这种情况下,使用调度程序而不是
    Thread.sleep(五分钟)
    可以避免不必要地占用资源(可能您正在保留数据库连接等)


    请注意,在这种情况下,您将使用一个调度程序,而不仅仅是
    线程#开始
    ,因此我允许对模式B进行相当自由的解释。

    对于模式B,我能找到的唯一一个好的用例是,在您想要重新运行该方法之前是否存在明显的延迟。例如,对于某种轮询系统,在系统关闭之前,该系统应每X分钟运行一次

    在这种情况下,使用调度程序而不是
    Thread.sleep(五分钟)
    可以避免不必要地占用资源(可能您正在保留数据库连接等)


    请注意,在这种情况下,您将使用一个调度程序,而不仅仅是
    线程#启动
    ,因此我允许对模式B进行相当自由的解释。

    它们的行为将非常不同

    第一个解决方案将循环,直到
    条件
    为false,然后终止

    第二种解决方案将启动一个新螺纹并进行模具加工,直到
    条件
    为false。它可能会完成您想要做的事情,但它会浪费大量资源来分配和销毁新线程

    下面是一个循环5个值并打印值和当前线程名称的示例:

    循环

    Runnable loop = new Runnable() {
    
        int i = 0;
    
        @Override
        public void run() {
            do {
                System.out.printf("%s: %s%n", Thread.currentThread().getName(), i);
                i++;
            } while(i < 5);
        }
    };
    loop.run();
    
    Runnable thread = new Runnable() {
    
        int i = 0;
    
        @Override
        public void run() {
            System.out.printf("%s: %s%n", Thread.currentThread().getName(), i);
            i++;
            if(i < 5) {
                new Thread(this).start();
            }
        }
    };
    thread.run();
    
    Runnable循环=新的Runnable(){
    int i=0;
    @凌驾
    公开募捐{
    做{
    System.out.printf(“%s:%s%n”,Thread.currentThread().getName(),i);
    i++;
    }而(i<5);
    }
    };
    loop.run();
    
    主:0
    主要:1
    主:2
    主要新闻:3
    主要新闻:4

    线程化的

    Runnable loop = new Runnable() {
    
        int i = 0;
    
        @Override
        public void run() {
            do {
                System.out.printf("%s: %s%n", Thread.currentThread().getName(), i);
                i++;
            } while(i < 5);
        }
    };
    loop.run();
    
    Runnable thread = new Runnable() {
    
        int i = 0;
    
        @Override
        public void run() {
            System.out.printf("%s: %s%n", Thread.currentThread().getName(), i);
            i++;
            if(i < 5) {
                new Thread(this).start();
            }
        }
    };
    thread.run();
    
    Runnable thread=new Runnable(){
    int i=0;
    @凌驾
    公开募捐{
    System.out.printf(“%s:%s%n”,Thread.currentThread().getName(),i);
    i++;
    如果(i<5){
    新线程(this.start();
    }
    }
    };
    thread.run();
    
    主:0
    线程0:1
    线程1:2
    线程2:3
    线程3:4


    正如您所看到的,线程示例在不同的线程上打印每一行,这是非常浪费的,可能不是您想要完成的任务。

    它们的行为会非常不同

    第一个解决方案将循环,直到
    条件
    为false,然后终止

    第二种解决方案将启动一个新螺纹并进行模具加工,直到
    条件
    为false。它可能会完成您想要做的事情,但它会浪费大量资源来分配和销毁新线程

    下面是一个循环5个值并打印值和当前线程名称的示例:

    循环

    Runnable loop = new Runnable() {
    
        int i = 0;
    
        @Override
        public void run() {
            do {
                System.out.printf("%s: %s%n", Thread.currentThread().getName(), i);
                i++;
            } while(i < 5);
        }
    };
    loop.run();
    
    Runnable thread = new Runnable() {
    
        int i = 0;
    
        @Override
        public void run() {
            System.out.printf("%s: %s%n", Thread.currentThread().getName(), i);
            i++;
            if(i < 5) {
                new Thread(this).start();
            }
        }
    };
    thread.run();
    
    Runnable循环=新的Runnable(){
    int i=0;
    @凌驾
    公开募捐{
    做{
    System.out.printf(“%s:%s%n”,Thread.currentThread().getName(),i);
    i++;
    }而(i<5);
    }
    };
    loop.run();
    
    主:0
    主要:1
    主:2
    主要新闻:3
    主要新闻:4

    线程化的

    Runnable loop = new Runnable() {
    
        int i = 0;
    
        @Override
        public void run() {
            do {
                System.out.printf("%s: %s%n", Thread.currentThread().getName(), i);
                i++;
            } while(i < 5);
        }
    };
    loop.run();
    
    Runnable thread = new Runnable() {
    
        int i = 0;
    
        @Override
        public void run() {
            System.out.printf("%s: %s%n", Thread.currentThread().getName(), i);
            i++;
            if(i < 5) {
                new Thread(this).start();
            }
        }
    };
    thread.run();
    
    Runnable thread=new Runnable(){
    int i=0;
    @凌驾
    公开募捐{
    System.out.printf(“%s:%s%n”,Thread.currentThread().getName(),i);
    i++;
    如果(i<5){
    新线程(this.start();
    }