1.创建好线程,然后去找代码执行,执行的是run方法。
创建线程两种方式
第一种:
创建子类重写Thread的run方法
//第一种创建线程方法
Thread thread = new Thread(){
@Override
public void run() {
//要执行的代码
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获取当前线程的名称
System.out.println(Thread.currentThread().getName());
}
}
};
thread.start();
分析Thread的run方法
@Override
public void run() {
if (target != null) {
target.run();
}
}
/* What will be run. */
private Runnable target;
如果不重写Thread的run方法,就会执行Thread的run方法,如果target不等于null,就会执行target的run方法,而target是Runnable的一个对象,作为Thread的构造方法的参数传入,由此可以得出:
第二种创建方式(常用):
重写Runnable的run方法,作为Thread的构造方法的参数传入(Runnable不是线程,而是Thread执行代码的宿主)
//第二种创建线程方法
Thread thread2 = new Thread(new Runnable(){
//重写Runnable的run方法
@Override
public void run() {
//要执行的代码
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获取当前线程的名称
System.out.println(Thread.currentThread().getName());
}
}
});
thread2.start();
思考:
new Thread(new Runnable(){
@Override
public void run() {
//要执行的代码
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获取当前线程的名称
System.out.println("runnable:"+Thread.currentThread().getName());
}
}
}
){
@Override
public void run() {
//要执行的代码
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获取当前线程的名称
System.out.println("thread:"+Thread.currentThread().getName());
}
}
}.start();
上面这个代码会打印出”thread:“+.........getName(),因为对Thread的run方法进行了重写,所以会调用重写的run方法。