创建和启动java线程 (二)

2014-11-24 11:44:56 · 作者: · 浏览: 18
new MyRunnable());(译者注:此处原作者在MyRunnable()前少了关键字new,应为笔误)
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 和(或者)操作系统决定线程执行的顺序。这个顺序和那些线程启动的顺序并不一定相同。