一、创建线程
编写线程运行时执行的代码有两种方式:一种是创建Thread子类的一个实例并重写run方法,第二种是创建类的时候实现Runnable接口。
1、创建Thread的子类
创建Thread子类的一个实例并重写run方法,run方法会在调用start()方法之后被执行。例子如下:
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("extends thread!");
}
}
可以用如下方式创建并运行上述Thread子类:
new MyThread().start();
补充:也可以如下创建一个Thread的匿名子类并执行它:
new Thread(){
public void run(){
System.out.println("anonymous extends thread!");
}
}.start();
2、实现Runnable接口
新建一个实现了java.lang.Runnable接口的类的实例,实例中的方法可以被线程调用。例子如下:
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("implements runnable!");
}
}
要使线程执行run()方法,需要在Thread类的构造函数中传入MyRunnable的实例对象。示例如下:new Thread(new MyRunnable()).start();
补充:也可以一个实现了Runnable接口的匿名类并执行它:
new Thread(
new Runnable() {
@Override
public void run() {
System.out.println("anonymous implement runnable!");
}
}
).start();
二、一些问题
1、关于线程的执行
一旦线程启动后start方法就会立即返回,而不会等待到run方法执行完毕才返回。
2、调用run()方法和start()方法的区别:
当创建一个线程并调用线程的run()方法时,如下所示:
new MyThread().run(); //new MyThread().start();
用上面的方式调用的run()方法并非是由刚创建的新线程所执行的,而是被创建新线程的当前线程所执行的。想要让创建的新的线程执行run()方法,必须调用新线程的start方法即被注释的方式。
3、线程的名称
当创建一个线程的时候,可以给线程起一个名字。示例如下:
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable, "My First Thread");
thread.start();
System.out.println(thread.getName());
在Runnable的实现类中,如果要获取线程名可以通过如下方式取得当前线程的引用:
Thread.currentThread();