日期:2014-05-20  浏览次数:20787 次

新手问个多线程的问题
先写个简单的例子:
public class T implements Runnable
{
   public void run()
   {System.out.println(Thread.currentThread().getName());}   
public static void main(String[] args)
   {
    T t1 = new T();    
Thread tt = new Thread(t1,"tt");
Thread ttt = new Thread(t1,"ttt");
tt.start();
ttt.start();
   }
}

这里后面创建线程的时候还可以用
T t1 = new T();
T t2 = new T();    
Thread tt = new Thread(t1,"tt");
Thread ttt = new Thread(t2,"ttt");
tt.start();
ttt.start();


那请问这两种方法创建的线程有什么区别呢?

------解决方案--------------------
如果你把T对象看作是米饭。代码1只有一碗米饭,被tt和ttt同时吃(都是t1),tt吃了一口在ttt看来米饭的状态就变了(不考虑可视性的话)。而代码2有两碗米饭,tt和ttt各吃各的(一个操作t1一个操作t2),相互没有影响。
------解决方案--------------------
其实可以把t1和t2换成另外一种叫法:叫task(没有调用start方法的都叫task,调用start方法的叫线程。这个叫法并不严谨,只是为了好理解而已。而且task只能被线程执行,当然你也可以线程自己执行自己的task)。
这就非常好理解了。
第一个里:
tt线程执行t1这个task,ttt线程也执行t1这个task。
第二个里:
tt线程执行t1这个task,ttt线程执行t2这个task。
------解决方案--------------------
当你的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;