1、要实现多线程,可以继承Thread类或实现Runnable接口,并且重写run方法,通过调用start方法启动线程,并自动调用run方法。
2、事实上run方法可以被重载,但线程执行时,默认只会调用无参数、无返回值的run方法。而重载的run方法只能显示调用。与其它的方法调用一样,是在调用它的线程中执行的
3、join方法:Waits for this thread to die. 即所等待的线程结束之后才会继续向下执行。
下面举例说明:
public class Starter extends Thread{
private int x = 2;
public Starter(){
x = 5;
start();
}
public void run(){
System.out.println(Thread.currentThread().getName());
x*=2;
System.out.println("x = "+x +" after run() method invoked!");
}
public void run(int y) throws Exception{
join();
System.out.println(Thread.currentThread().getName());
x-= y;
System.out.println(x);
}
public static void main(String[] args) throws Exception{
new Starter().run(1);
}
}
output:
Thread-0
x = 10 after run() method invoked!
main
9
如果不调用join方法
public void run(int y) throws Exception{
System.out.println(Thread.currentThread().getName());
x-= y;
System.out.println(x);
}
output:
main
4
Thread-0
x = 8 after run() method invoked!
这说明如果不调用join方法,主线程不会等待,而是直接执行,而jvm要创建线程需要一定时间,因此一般来说会比较慢。
另外需要强调的是,要启动线程,必须调用start方法,通过start方法调用run方法。如果直接调用run方法,并不会启动线程,而是相等于普通都方法调用,都是在主线程中执行。example:
public class Starter extends Thread{
private int x = 2;
public void run(){
System.out.println(Thread.currentThread().getName());
x*=2;
System.out.println("x = "+x +" after run() method invoked!");
}
public static void main(String[] args) throws Exception{
new Starter().run();
}
}
output:
main
x = 4 after run() method invoked!