请教new Thread()的问题

减不了肥的小李
  • 9

题目描述

请问下面两种创建多线程的方法的区别与联系?

相关代码

TicketsThread ticketsThread = new TicketsThread();
new Thread(ticketsThread, "苦逼的你").start();
new Thread(ticketsThread, "牛逼的我").start();
new Thread(ticketsThread, "可恶的黄牛党").start();

和

TicketsThread ticketsThread1 = new TicketsThread();
TicketsThread ticketsThread2 = new TicketsThread();
TicketsThread ticketsThread3= new TicketsThread();
new Thread(ticketsThread1, "苦逼的你").start();
new Thread(ticketsThread2, "牛逼的我").start();
new Thread(ticketsThread3, "可恶的黄牛党").start();

//TicketsThread类代码:
class TicketsThread implements Runnable {
   //加static 或者不加
   static int a = 1;

   @Override
   public void run() {
       for (int i = 0; i <10; i++) {
           System.out.println(a++);
       }
   }
}
回复
阅读 563
3 个回答
✓ 已被采纳

你这两种写法有没有区别取决于你的 TicketsThread 是怎么写的。

    public Thread(Runnable target, String name) {
       this(null, target, name, 0);
    }

上面的源码是 Thread 其中一个构造函数,这个构造函数的目标是获取 Runnablerun 方法来运行。

如果你的 TicketsThread 也就是 Runnable 中有成员变量,并且 run 方法中使用了,那么可能会有影响,比如下面的代码:

    public class TicketsThread extends Thread {
       private int a = 1;

       @Override
       public void run() {
           a++;
           System.out.println(a);
       }
   }

你的两种写法,在这个会出现不一致的结果。

如果你的成员变量是静态的,两次运行的结果就基本是一致的:

    public static class TicketsThread extends Thread {
       private static int a = 1;

       @Override
       public void run() {
           a++;
           System.out.println(a);
       }
   }

TicketsThread 是个啥?这好像不是 Java 内置的类型吧?

Thread 在作为Thread的构造参数的时候,可以看作Runnable。这两段代码有很大的区别,第一段表示开启3个线程,但是执行同一个Runnable,这里是只同一个对象。第二段代码表示开启3个线程,分别执行3个Runnable,即3个对象,不过这3个Runable 是同一个class而已。

宣传栏