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();
}
}
第二种方法对我来说似乎更干净,经过一些讨论,我被告知使用第二种方法不是一个好主意
问题:
因为方法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();
}