newThread.run(); //本应该是start()方法
在开始的时候你可能没发现什么问题,因为这个Runable的run()方法如你所料的执行了。然而,这个run()方法并不是你刚才所创建的线程(译者注:指的是newThread对象)所执行的。并不是这个线程执行的run()方法,而是这个run()方法创建了这个线程。换句话说,这个线程执行了上面两行代码,新创建的线程调用执行了MyRunable实例的run()方法。(译者注:可能有些绕人,可以这么理解,第一行代码创建一个线程对象newThread.第二行代码又创建了一个线程。我们暂且称之为tempThread。tempThread执行了MyRunnable实例的run()方法)对于这个newThread,你必须调用它的start()方法。
线程名称
当你创建了一个线程,你可以给予他一个名称。这个名称可以让你把它同其他的线程区分开来。例如有多个线程在使用System.out输出内容的时候,你可以很轻易地看出是哪个线程输出的文本。这儿有一个例子:
[java]
Thread thread = new Thread("New Thread"){
public void run(){
System.out.println("run by:"+getName());
}
};
thread.start();
System.out.println(thread.getName());
}
Thread thread = new Thread("New Thread"){
public void run(){
System.out.println("run by:"+getName());
}
};
thread.start();
System.out.println(thread.getName());
}
注意那个”New Thread”字符串作为一个参数传递给Thread的构造器。这个字符串是这个线程的名称。可以通过线程的getName()方法获得线程的名称。当你在使用一个Runnable接口的实现时你也可以传递一个名称给这个线程。请看:
[java]
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable,"New Thread");
thread.start();
System.out.println(thread.getName());
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable,"New Thread");
thread.start();
System.out.println(thread.getName());
注意:无论怎么样,只要MyRunable类不是Thread的子类,他就没有权限使thread的getName方法去执行。可以使用下面的代码获得当前执行的线程:
[java]
Thread.currentThread();
Thread.currentThread();
获得当前执行的线程的名称,可以这样做:
[java]
String threaName = Thread.currentThread().getName();
String threaName = Thread.currentThread().getName();
一个线程例子
这里有一个小例子。首先他打印出了当前执行这个main()方法的线程的名称。这个线程是JVM分配的。然后他启动了10个线程并且都给他们一个数字作为名称(“”+i)。每个线程随后打印出自己名称。然后停止执行。
[java]
public class ThreadExample {
public static void main(String []args){
System.out.println(Thread.currentThread().getName());
for(int i=0;i<10;i++){
new Thread(""+i){
public void run(){
System.out.println("Thread: "+getName()+"running");
}
}.start();
parallel }
}
}
public class ThreadExample {
public static void main(String []args){
System.out.println(Thread.currentThread().getName());
for(int i=0;i<10;i++){
new Thread(""+i){
public void run(){
System.out.println("Thread: "+getName()+"running");
}
}.start();
parallel }
}
}
注意即使线程按顺序启动(1,2,3等等)但他们也许不按顺序执行。意味着thread1也许不是第一个将他的名字写入System.out的。这是因为原则上线程是并行执行的而不是顺序的。JVM 和(或者)操作系统决定线程执行的顺序。这个顺序和那些线程启动的顺序并不一定相同。