使用相同的runnable实例初始化两个线程是不是很糟糕的编程?使用runnable的单独实例进行初始化会有什么不同,并且对于runnable的同一实例共享内存位置与性能有什么关系?
public static void main(String[] args)throws Exception {
H h = new H();
H h2 = new H();
Thread j = new Thread(h);
j.setName("11");
Thread jj = new Thread(h);//instead of new H()
jj.setName("22");
j.start();
jj.start();
}
class H implements Runnable {
public void run() {
while(true) {
System.out.println(Thread.currentThread().getName());
}
}
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 18
只要您运行的代码旨在支持它,就可以完成它.它不仅可以通过单个实例而不是多个实例来节省一些内存,但如果这些线程试图通过共享数据进行通信,那么它可能是绝对必需的!
不可否认,通过共享状态进行通信是线程经常变得棘手的地方,所以这需要仔细完成,但从线程系统本身的角度来看,让两个线程调用run
单个Runnable
实例的方法绝对没有问题.
由于H
没有任何实例状态,使用多个实例无关紧要.Runnable
实例开始存储状态时需要注意.
public class Main implements Runnable {
volatile int i;
public void run() {
for (i = 0; i < 100; i++) {
System.out.println(i);
}
}
public static void main(String[] args) {
Main a = new Main();
Thread t1 = new Thread(a);
Thread t2 = new Thread(a);
t1.start();
t2.start();
}
}
Run Code Online (Sandbox Code Playgroud)
什么被印刷?当你确实需要在线程之间共享状态时,最好使用这些类java.util.concurrent
.它们主要由多线程专家(Doug Lea,Java并行编程的作者)编写,并经过许多人的测试.为自己省一些心痛.:)
使用相同的runnable实例初始化两个线程是不是很糟糕的编程?
不是特别的.但是,如果Runnable
实例具有实例字段,那么您需要确保线程对字段的所有访问都已正确同步,这将使代码更复杂.
使用runnable的单独实例进行初始化会有什么不同,并且对于runnable的同一实例共享内存位置与性能有什么关系?
通过Runnable
在多个线程之间共享实例而节省的内存是微不足道的......除非Runnable
保存了大量的实例数据.(如果确实如此,则可能会使实例不可共享.)
您的H
类是一个示例,其中共享实例是安全的,但没有意义,因为内存节省是无关紧要的.(Runnable
没有实例字段的对象大约占用8到16个字节,具体取决于平台.)
归档时间: |
|
查看次数: |
17204 次 |
最近记录: |