1、继承Thread类
1)以继承Thread类的方式来创建线程,多个线程之间是不会共享类的实例变量的,当然肯定会共享类变量。下面通过一个例子来看一下:
public class Ex1 extends Thread{ public Ex1(String name){ super(name); } private int i=0; public void run(){ i++; System.out.println(getName()+": "+i); } public static void main(String[] args) { for(int j=0; j<5; j++){ Thread t=new Ex1("线程"+j); t.start(); } } }
运行结果如下:
可以看出,所有线程的i值都是1,因此每个线程没有共享实例变量i。
2)多线程之间可以共享类变量
public class Ex1 extends Thread{ public Ex1(String name){ super(name); } private static int i=0; public void run(){ i++; System.out.println(getName()+": "+i); } public static void main(String[] args) { for(int j=0; j<5; j++){ Thread t=new Ex1("线程"+j); t.start(); } } }
运行结果如下:
这个是没什么好解释的。
2、实现Runnable接口
1)以实现Runnable接口的方式来创建线程,多个线程之间是会共享类的实例变量的,当然肯定也会共享类变量。下面通过一个例子来看一下:
public class Ex1 implements Runnable{ private int i=0; public void run(){ i++; System.out.println(Thread.currentThread().getName()+": "+i); } public static void main(String[] args) { Ex1 ex=new Ex1(); for(int j=0; j<5; j++){ Thread t=new Thread(ex, "线程"+j); t.start(); } } }
运行结果如下:
可以看到,多个线程输出的i值是连续的,因此他们是共享实例变量的。这是因为我们在创建线程时是使用的同一个对象ex,所以他们共享此线程类的实例变量。
2)再看下面这个例子:
public class Ex1 implements Runnable{ private int i=0; public void run(){ i++; System.out.println(Thread.currentThread().getName()+": "+i); } public static void main(String[] args) { for(int j=0; j<5; j++){ Ex1 ex=new Ex1(); Thread t=new Thread(ex, "线程"+j); t.start(); } } }
运行结果如下:
这里我们为每个线程都创建了一个对象,每个线程对应不同的对象的i,没有共享i,因此i值是相同的。