创建并运行Java线程
Java线程是一个object类,它的实例都继承自java.lang.Thread或其子类
创建线程的办法:
Thread thread = new Thread();
执行线程的办法
thread.start();
编写线程运行时的代码有两种方式:
1. 创建Thread子类
Step 1: 创建Thread子类并重写run方法,run方法在调用start()方法后被执行
public class MyThread extends Thread{
public void run(){
// to do something
}
}
Step 2: 创建并运行上述子类
MyThread mThread = new MyThread();
mThread.start();
2.实现Runnable接口
Step 1:新建一个实现java.lang.Runable接口的类的实例,实例中的方法可以被线程调用
public class MyRunnable implements Runable{
public void run(){
// to do something
}
}
Steo 2:为了执行run()方法,需要在Thread类的构造函数中传入MyRunnable的实例对象
Thread thread = new Thread(new MyRunnable());
thread.start();
两种方法都可以用匿名类的形式实现
Runnable myRunnable = new Runnable(){
public void run(){
System.out.println("Runnable running");
}
}
Thread thread = new Thread(myRunnable);
thread.start();
创建子类还是实现Runnable接口?——No Answer
- 如果实现Runnable接口这种方法,因为线程池可以有效的管理实现了Runnable接口的线程,如果线程池满了,新的线程就会排队等候执行,直到线程池空闲出来为止
而如果线程是通过实现Thread子类实现的,这将会复杂一些 - 有时我们要同时融合实现Runnable接口和Thread子类两种方式。例如,实现了Thread子类的实例可以执行多个实现了Runnable接口的线程。一个典型的应用就是线程池。
常见错误:调用run()方法而非start()方法
创建并运行一个线程所犯的常见错误是调用线程的run()方法而非start()方法,如下所示:
Thread newThread = new Thread(MyRunnable());
newThread.run(); //should be start();
起初你并不会感觉到有什么不妥,因为run()方法的确如你所愿的被调用了。但是,事实上,run()方法并非是由刚创建的新线程所执行的,而是被创建新线程的当前线程所执行了。也就是被执行上面两行代码的线程所执行的。想要让创建的新线程执行run()方法,必须调用新线程的start方法。
其实,很显然,使用run()的调用,它只不过是在本线程中调用了该类内的方法罢了
线程名
创建一个线程的时候,可以给线程起一个名字。它有助于我们区分不同线程
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable, "Name A");
thread.start();
System.out.println(thread.getNaem());
另外,MyRunnable并非Thread的子类,所以它没有getName()方法。可以通过如下代码获得当前线程的名字:
String threadName = Thread.currentThread().getName();
简单的一个示例
public class TryThread {
public static void main(String args[]){
System.out.println(Thread.currentThread().getName());
for(int i=0; i<10; i++){
new Thread("" + i){
@Override
public void run() {
System.out.println("Thread:" + getName() + "running");
}
}.start();
}
}
}