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不能实现资源共享,可是这个程序明明是可以的啊?求解释 展开
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不能实现资源共享,可是这个程序明明是可以的啊?求解释 展开
2个回答
展开全部
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接口在本质上没有任何区别不是吗,都是由一个对象构造出的线程,当然是共享同一份数据了
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,例一和例二是同样的程序!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询