java的线程是一个对象,如其他任何java对象一样。线程是类java.lang.Thread的实例,或者是这个类的子类的实例。
在java中你可以这样创建线程:
[java]
Thread thread = new Thread();
Thread thread = new Thread();
你可以调用这个线程对象的start()方法去启动它:
[java]
Thread.start();
Thread.start();
在这个例子中,这个线程并没有执行任何代码。因此,它会马上停止。
你有两种方式可以指定线程要执行的代码:
第一种就是去创建一个Thread的子类并且重写其Run()方法。第二种方法是通过让一个对象实现Runnable()接口,并且也要重写Run()方法。
Thread子类
给一个线程指定所执行的代码的第一种方法是:去创建一个Thread的子类,并且重写其run()方法。这个run()方法会在你调用satrt()方法后被线程执行。这里有个例子:
[java]
public class MyThread extends Thread{
public void run(){
System.out.println("myThread running!");
}
}
public class MyThread extends Thread{
public void run(){
System.out.println("myThread running!");
}
}
去创建和启动上面的线程,你可以这样做:
[java]
MyThread myThread = new MyThread();
myThread.start();
MyThread myThread = new MyThread();
myThread.start();
start()方法的调用会在线程启动之后立即停止,在run()方法执行后开始等待。Run()方法执行时好像是被一个不同的CPU调用的。当这个run()方法执行时会打印出”MyThread running”字样。
你也可以创建一个匿名的Thread子类,像这样:
[java]
Thread thread = new Thread(){
public void run(){
System.out.println("Thread Ruuning!");
}
};(译者注:原文中此处少了分号,应为作者笔误)
thread.start();
Thread thread = new Thread(){
public void run(){
System.out.println("Thread Ruuning!");
}
};(译者注:原文中此处少了分号,应为作者笔误)
thread.start();
当run()方法被新线程调用的时候这个例子会打印出”Thread Running”字样。
实现Runnable接口
给一个线程指定要执行的代码的第二种方法是创建一个类让他实现java.lang.Runnable接口。这个实现了Runable对象可以被一个线程执行:
[java]
public class MyRunnable implements Runnable{
public void run(){
System.out.println("MyRunnable running!");
}
}
public class MyRunnable implements Runnable{
public void run(){
System.out.println("MyRunnable running!");
}
}
在一个Thread的构造函数中通过一个MyRunnable的实例,可以让这个线程执行MyRunable的run()方法。来看下代码:
[java]
Thread thread = new Thread(new MyRunnable());
thread.start();
Thread thread = new Thread(new MyRunnable());
thread.start();
当这个线程启动之后,他会执行MyRunnable实例的run()方法而不是她自己的run()方法。上面的例子会打印出"MyRunnable running!"的字样。
你也可以创建一个匿名类来实现Runnable接口,像这样:
[java]
Runnable myRunnable = new Runnable() {
@Override
public void run() {
System.out.println("Runnable running!");
}
};(译者注:原文中此处少了分号,应为作者笔误)
Thread thread = new Thread(myRunnable);
thread.start();
Runnable myRunnable = new Runnable() {
@Override
public void run() {
System.out.println("Runnable running!");
}
};(译者注:原文中此处少了分号,应为作者笔误)
Thread thread = new Thread(myRunnable);
thread.start();
子类或者Runnable接口?
没有规则规定这两个方法中,哪个是更好的。就我个人而言,我比较喜欢实现Runnable接口并且传递一个实现了Thread实例的实例(译者注:作为参数)。(译者注:如果大家对我翻译的这句难以理解,参照原文。原文是: I prefer implementing Runnable, and handing aninstance of the implementation to a Thread instance.)当一个线程池去执行一个Runnable实例的时候,如果线程池里没有线程是空闲的,他很容易做到给这个Runnable实例排队。而这一点对于Thread子类来说,很难做到。
有时你不得不实现Runnable接口以及Thread子类。例如,你创建一个Thread子类他可以实现多个Runnable接口。当你想实现一个线程池的时候通常都采用这种方案。
常见的陷阱:调用run()方法而不是start()方法
当创建和启动一个线程的时候一个常见的错误就是去调用这个线程的run()方法而不是start()方法,就像这样:
[java]
Thread newThread = new Thread(new MyRunnable());(译者注:此处原作者在MyRunnable()前少了关键字new,应为笔误)
newThread.run(); //本应该是start()方法
Thread newThread = new Thread(