使用相同的可运行实例初始化两个线程

2022-09-02 00:55:05

使用相同的 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());
        }
    }
}

答案 1

只要您运行的代码旨在支持它,这样做绝对没问题。它不仅可以通过单个实例而不是多个实例来节省一些内存,而且如果这些线程试图通过共享数据进行通信,那么它可能是绝对需要的!

诚然,通过共享状态进行通信是线程经常变得棘手的地方,因此这需要仔细完成,但是从线程系统本身的角度来看,让两个线程调用单个实例的方法绝对没有问题。runRunnable


答案 2

由于没有任何实例状态,因此使用多个实例无关紧要。当实例开始存储状态时,您需要小心。HRunnable

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();
    }        
}

打印的内容是什么?当您确实需要在线程之间共享状态时,最好使用 java.util.concurrent 中的类。它们主要由多线程专家(Doug LeaJava中的并发编程的作者)编写,并由许多人测试。省去一些心痛。:)


推荐