java中Thread类与Runnable接口实现资源共享的疑问

代码一:使用Runnable实现资源共享:publicclassRunnableShareimplementsRunnable{privateintshare=5;pub... 代码一:使用Runnable实现资源共享:

public

class RunnableShare implements Runnable {

private int share = 5;

public void run () {

for(int i = 0 ; i<100;i++){

if(this.share > 0)
System.out.println("use : share = " + this.share -- );

}

}

public static void main(String args []){
RunnableShare myThread1 =

new RunnableShare();

new Thread(myThread1).start();

new Thread(myThread1).start();

new Thread(myThread1).start();

new Thread(myThread1).start();

new Thread(myThread1).start();

new Thread(myThread1).start();
}

}

运行结果:

use : share = 5

use : share = 3

use : share = 1

use : share = 4

use : share = 2

代码二:使用Thread类实现资源共享

public

class ThreadNotShare extends Thread{

private int share = 5;

public void run(){

for(int i = 0 ; i < 50 ; i++)

if(this.share > 0){
System.out.println("shar = " + this.share--);

}

}

public static void main(String args[]) {
ThreadNotShare myThread1 =

new ThreadNotShare();

new Thread (myThread1).start();

new Thread(myThread1).start();

new Thread(myThread1).start();

new Thread(myThread1).start();

new Thread(myThread1).start();

new Thread(myThread1).start();
}

}

运行结果:

shar = 5

shar = 1

shar = 2

shar = 3

shar = 4

有的人说,Thread不能实现资源共享,可是这个程序明明是可以的啊?求解释
展开
 我来答
小白AI绘画
2011-11-21 · TA获得超过1358个赞
知道小有建树答主
回答量:303
采纳率:0%
帮助的人:467万
展开全部
public class ThreadNotShare extends Thread{

private int share = 5;

public void run(){

for(int i = 0 ; i < 50 ; i++)

if(this.share > 0){
System.out.println("shar = " + this.share--);

}

}
public static void main(String args[]) {
ThreadNotShare t1 = new ThreadNotShare();
ThreadNotShare t2 = new ThreadNotShare();
ThreadNotShare t3 = new ThreadNotShare();
t1.start();
t2.start();
t3.start();
}
}
上面是一个继承Thread之后,因为由一个线程类分别构造了3个对象,所以各自有各自的数据,对象之间是数据不共享的

至于楼主的问题
例二表面看是继承了一个Thread类,但是调用的方法依旧是把一个线程类的对象交给Thread去构造,和实现Runnable接口在本质上没有任何区别不是吗,都是由一个对象构造出的线程,当然是共享同一份数据了
追问
那再问一下如果按照你例子的t1,t2,t3这种直接实例化thread的子类构造对象来创建线程的话,我如果写
t1.start();
t1.start();那肯定会出现重复调用线程的例外,但是用
new Thread(myThread1).start();
new Thread(myThread1).start();
会什么就不会出现例外呢?这两种创建线程有什么区别?
追答
你例二的用法,继承Thread只是一个表面,用法和实现Runnable接口是一样的,你把例一例二放一起比较,再看我的代码,会发现例一例二的工作模式都是先实例化一个线程对象,再交给一个Thread的对象去构造,然后start(),而我的是线程类自己调用自己的start()

再说的直接一点,例二就是个骗人的程序,看着extends Thread,其本质还只是实现Runnable,例一和例二是同样的程序!
百度网友9308069
2011-11-21 · TA获得超过1万个赞
知道大有可为答主
回答量:3947
采纳率:89%
帮助的人:1886万
展开全部
都不是“资源共享”--不是线程间的内存共享。
2段都是各生成5个实例对象,各自的5块内存空间。

线程间也是可以共享内存的,但要注意同步性。所以“Thread不能实现资源共享”这种表述也是不准确的,可能是转述误解,或者断章取义。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式