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

求大神解释线程start和用ExecutorService的区别。(非书上基本概念,请看代码)
程序的目的是:A,B,C三个线程合作按顺序连续打印十次自己的ID。ABC ABC ABC。。。这样下去。
用线程的start方法可以成功,但是使用了ExecutorService缺阻塞了,为什么呢?本人对线程不熟悉,恳请赐教。
package Test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;


public class TestThreadLocal {
public static void main(String[] args) {
mythread A=new mythread("A");
mythread B=new mythread("B");
mythread C=new mythread("C");
// A.start();//如果直接start程序可以正确运行。
// B.start();
// C.start();
ExecutorService es=Executors.newCachedThreadPool();//这样使用会阻塞的。为什么呢?
es.execute(A);
es.execute(B);
  es.execute(C);
  es.shutdown();
}

}

class mythread extends Thread{
public static boolean flag=true;
public static String turn="A";//用来保证线程执行顺序的。
public String name;
public mythread(String name){
super(name);
this.name=name;
}

public synchronized static void print() throws InterruptedException {
String temp=currentThread().getName();
while(!temp.equals(turn)){
mythread.class.wait();
}
System.out.print(temp);
if(temp.equals("A"))turn="B";
if(temp.equals("B"))turn="C";
  if(temp.equals("C")){
  turn="A";
  System.out.println();
  }
  mythread.class.notifyAll();
}
public void run(){
for(int i = 0;i<10;i++) {
try {
print();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

}

------解决方案--------------------
temp.equals(turn)主要原因在于这个,线程池中的线程是由线程池本身去创建与管理的,即使你外面创建了Thread对象,它也是当做Runnable,不会直接去使用你的Thread对象的start方法的,所以,线程池中的线程的名字并不是在你的Thread对象中传入的名字

在String temp=currentThread().getName();之后System.out.println(tmp)即知