Thread与Runnable

这里我想说的是继承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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值