java里只能允许单一继承,即一个子类只能有一个父类,所以java中如果一个类继承了某一个类,同时又想采用多线程技术的时候,就不能用Thread类产生线程,此时要用Runnable接口来创建线程。
  而且使用Runnable接口创建多个线程时,这些线程的资源是共享的。

解决方案 »

  1.   

    我是问 T t1 = new T();    
                     Thread tt = new Thread(t1,"tt");
                     Thread ttt = new Thread(t1,"ttt");
    和T t1 = new T();
                 T t2 = new T();    
                 Thread tt = new Thread(t1,"tt");
                 Thread ttt = new Thread(t2,"ttt");
    这两种方式会有哪些差别?
      

  2.   

    如果你把T对象看作是米饭。代码1只有一碗米饭,被tt和ttt同时吃(都是t1),tt吃了一口在ttt看来米饭的状态就变了(不考虑可视性的话)。而代码2有两碗米饭,tt和ttt各吃各的(一个操作t1一个操作t2),相互没有影响。
      

  3.   

    其实可以把t1和t2换成另外一种叫法:叫task(没有调用start方法的都叫task,调用start方法的叫线程。这个叫法并不严谨,只是为了好理解而已。而且task只能被线程执行,当然你也可以线程自己执行自己的task)。
    这就非常好理解了。
    第一个里:
    tt线程执行t1这个task,ttt线程也执行t1这个task。
    第二个里:
    tt线程执行t1这个task,ttt线程执行t2这个task。
      

  4.   

    当你的T里面包含其他资源的时候,你把这两个T的对象放到线程里面执行的话,着两个线程里面的两个T对象所用的资源是分别属于两个T的,你把一个T的对象分别放到两个线程里面执行,着两个线程是会公用你这一个T里面的资源的。
    比如你T 里面有一个int i=10;你run里面写个循环将i减1并打印一次,直到i等于0位置。
    你建立一个T对象的话,那么这两个线程公用这一个i,所以一共输出10,9,8........0;
    你建立两个T对象放到线程里面,那这两个线程都有自己的i,所以每一个都输出,就有两个10,9,8........0;