Thread与Runnable

来源:互联网 发布:超牛数据恢复免费软件 编辑:程序博客网 时间:2024/05/17 08:24

这里我想说的是继承Thread类也可以实现数据共享

首先实现多线程有两种方法:

1、继承Threa类

2、实现Runnable接口


下面是书上与网上的都有的例子:

//继承Thread类class ThreadClass extends Thread{private int count = 10;@Overridepublic 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

发现也可以实现数据共享。不像书上网上说的不能实现数据共享。我的理解有些肤浅,还希望有高价指点迷津。

1 0
原创粉丝点击