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值是相同的。