这里我想说的是继承Thread类也可以实现数据共享
首先实现多线程有两种方法:
1、继承Threa类
2、实现Runnable接口
下面是书上与网上的都有的例子:
//继承Thread类
class ThreadClass extends Thread{
private int count = 10;
@Override
public void run(){
while(count>0){
System.out.println(Thread.currentThread().getName()+" "+count-- );
}
}
}
public class Test{
public static void main(String[] args){
ThreadClass thread1 = new ThreadClass();
ThreadClass thread2 = new ThreadClass();
ThreadClass thread3 = new ThreadClass();
thread1.start();
thread2.start();
thread3.start();
}
}
运行结果(每次结果不一样):
Thread-2 10
Thread-0 10
Thread-0 9
Thread-0 8
Thread-1 10
Thread-1 9
Thread-1 8
Thread-1 7
Thread-1 6
Thread-1 5
Thread-1 4
Thread-1 3
Thread-1 2
Thread-1 1
Thread-0 7
Thread-2 9
Thread-0 6
Thread-2 8
Thread-0 5
Thread-2 7
Thread-0 4
Thread-2 6
Thread-0 3
Thread-2 5
Thread-0 2
Thread-2 4
Thread-0 1
Thread-2 3
Thread-2 2
Thread-2 1
结果显示继承Thread类,没有实现数据共享。
下面是实现Runnable接口:
class RunnableClass implements Runnable{
//private int count = 10;
public void run(){
while(count>0){
System.out.println(Thread.currentThread().getName()+" "+count--);
}
}
}
如果像下面这样写,是错的:
public class Test{
public static void main(String[] args){
RunableClass thread1 = new RunableClass();
RunableClass thread2 = new RunableClass();
RunableClass thread3 = new RunableClass();
thread1.start();//错误 Runable 接口中没有start方法
thread2.start();//错误 Runable 接口中没有start方法
thread3.start();//错误 Runable 接口中没有start方法
}
}
我们看源码或者API可以发现Thread有个构造方法:
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
是接收一个Runnable的。
所能如果改成下面这样:
public class Test{
public static void main(String[] args){
RunableClass thread = new RunableClass();
new Thread(thread).start();
new Thread(thread).start();
new Thread(thread).start();
}
}
运行结果(随机):
Thread-2 10
Thread-1 10
Thread-3 9
Thread-1 7
Thread-2 8
Thread-1 5
Thread-3 6
Thread-1 3
Thread-2 4
Thread-1 1
Thread-3 2
我们可以看到 启动三个线程 后共享一个数据。
但是我们看源码或API后知道 Thread类电继承了Runnable接口的,那如果像下面这样改写继承Thread的线程:
public class Test{
public static void main(String[] args){
/*
ThreadClass thread1 = new ThreadClass();
ThreadClass thread2 = new ThreadClass();
ThreadClass thread3 = new ThreadClass();
thread1.start();
thread2.start();
thread3.start();
*/
ThreadClass thread = new ThreadClass();
new Thread(thread).start();
new Thread(thread).start();
new Thread(thread).start();
}
}
运行结果:
Thread-1 10
Thread-1 8
Thread-3 9
Thread-3 7
Thread-3 6
Thread-1 5
Thread-1 2
Thread-1 1
Thread-2 3
Thread-3 4
发现也可以实现数据共享。不像书上网上说的不能实现数据共享。我的理解有些肤浅,还希望有高价指点迷津。