黑马程序员技术交流社区

标题: 关于多线程共享的问题,求解 [打印本页]

作者: 高梦晓    时间: 2013-4-17 17:42
标题: 关于多线程共享的问题,求解
想知道用如下两种方法创建的线程共享变量时,有没有什么不同?或是哪一种好一些?
方法1,继承Thread类,使用静态变量:
  1. public static void main(String [] args){
  2.     MutliThread m1=new MutliThread("Window 1");
  3.     MutliThread m2=new MutliThread("Window 2");
  4.     m1.start();
  5.     m2.start();
  6.     }
  7. class MutliThread extends Thread{
  8.     private static int ticket=100;//共享变量
  9.     public void run(){
  10.        while(ticket>0){
  11.             System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());
  12.        }
  13.     }
  14. }
复制代码
方法2,实现Runnable接口:
  1. public static void main(String [] args){
  2.     MutliThread m1=new MutliThread("Window 1");
  3.     MutliThread m2=new MutliThread("Window 2");

  4.     Thread t1=new Thread(m1);
  5.     Thread t2=new Thread(m2);

  6.     t1.start();
  7.     t2.start();
  8.     }
  9. class MutliThread implements Runnable{
  10.     private int ticket=100;//共享变量
  11.     public void run(){
  12.        while(ticket>0){
  13.             System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());
  14.        }
  15.     }
  16. }
复制代码

作者: 董维明    时间: 2013-4-17 18:16
当然实现Runnable接口,,因为java类不支持多继承关系,如果一个类继承了Thread,那这个类就不能再继承其他类,但java中支持多实现,一个类可以同时实现N个接口,所以实现Runnable接口是最完美的
作者: JavaUtil    时间: 2013-4-17 18:29
楼上的话我就不重复了,如果是共享数据的话,还是用倾向于用Runnable接口的实现类好,如果用继承Thread的类,在变换静态变量时,以前用过该类的所有线程都会发生变化,不可控。
作者: 周音匀    时间: 2013-4-17 18:32
楼上说的对,java只能单继承,因此如果是采用继承Thread的方法,那么在以后进行代码重构的时候可能会遇到问题,因为你无法继承别的类了,在其他的方面,两者之间并没什么太大的区别。

作者: gerenvip    时间: 2013-4-17 21:26
如楼上两位同仁说的 由于java中类的基础具有单继承性,
例如
MutliThread继承Thread后就不能继承其他类, 但是有时候需要继承其他类,例如
student应该继承Person类,但是student类中的一部分代码需要用多线程执行,所以student要继承Thread,
但是student已经继承了Person,所以这时就不能继承Thread了。
这时就用到了第二种创建进程的方法,即声明实现 Runnable 接口的类
对于实现方式和继承方式有什么区别呢?
实现方式好处:避免单继承的局限性
    定义线程时,建议使用实现方式。


作者: 黄玉昆    时间: 2013-4-18 20:16
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2