IT程序员开发必备-各类资源下载清单,史上最全IT资源,个人收藏总结!
创建线程有两种方式:
(1)创建Thread的子类,重写run()方法
(2)创建Thread对象,传递一个Runnable实现类的对象
注意:
如果在Thread子类覆盖的run方法中编写了运行代码,也为Thread子类对象传递了一个Runnable对象,那么,线程运行时的执行代码为子类中的run()方法
Thread.class类的源代码
package java.lang;
public class Thread implements Runnable {
/* What will be run. */
private Runnable target;
private void init(ThreadGroup g, Runnable target, String name,
long stackSize) {
........//some code
this.target = target;
........//some code
}
public Thread() {
init(null, null, "Thread-" + nextThreadNum(), 0);
}
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
public Thread(ThreadGroup group, Runnable target) {
init(group, target, "Thread-" + nextThreadNum(), 0);
}
public Thread(String name) {
init(null, null, name, 0);
}
public Thread(ThreadGroup group, String name) {
init(group, null, name, 0);
}
public Thread(Runnable target, String name) {
init(null, target, name, 0);
}
public Thread(ThreadGroup group, Runnable target, String name) {
init(group, target, name, 0);
}
public Thread(ThreadGroup group, Runnable target, String name,
long stackSize) {
init(group, target, name, stackSize);
}
public void run() {
if (target != null) {
target.run();
}
}
}
例子程序:
package edu.review;
public class TraditionalThread {
public static void main(String[] args) {
第一种创建线程对象方式
Thread t1 = new Thread("线程1"){
@Override
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
System.out.println(this.getName());//这里的this指的是Thread的匿名子类
}
}
};
t1.start();
//第二种创建线程对象方式
Thread t2 = 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(Thread.currentThread().getName());
//System.out.println(this.getName());//这里的this不是Thread对象,所以没有getName()方法
}
}},"线程2");
t2.start();
//两种方式综合比较
/**
* 结果:程序 将执行Thread子类中的run()方法而不会执行Runnable接口的run()方法
* 原因:因为Thread中的run()方法:
* public void run() {
if (target != null) {
target.run();
}
}
* 所以当Thread子类重写其run()方法后,Thread中run()方法中的调用target.run()的代码就不会生效,所以Runnable的run()方法不会被执行
**/
Thread t3 = 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());//输出
}
}
};
t3.start();
}
}