第一种:继承Thread类
public class ThreadExplain extends Thread {
private String name;
ThreadExplain(String name){
super(name);//把线程名称传进线程里
this.name = name;
}
//多线程需要从写Thread里的run方法
public void run(){
for(int i = 0;i<10;i++){
//Thread.currentThread().getName()获取运行时线程名称
//getName()获取线程名称
//主线程的名称main
System.out.println(name+":name="+Thread.currentThread().getName());
}
}
}
public static void main(String[] args){
ThreadExplain t1 = new ThreadExplain("张三");
ThreadExplain t2 = new ThreadExplain("小王");
// 开启多线程
t1.start();
t2.start();
第二种方式实现Runnable接口
1、定义类实现线程Runnable接口
2、覆盖线程接口里run方法,将线程的任务代码封装到run方法中
3、通过Thread创建线程对象,并将Runable接口的子类对象作为Thread类的构造函数的参数进行传递
原因:因为线程任务都封装到在Runnable接口子类对象的run方法里,所以在线程对象创建时,就必须明确线程要运行的任务
4、调用线程对象的start方法进行线程的开启
5、实现Runnable的好处:
1)避免了java单继承的局限性
2)将线程的任务从线程的子类中分离出来,进行了单独的封装,按照面对对象的思想将任务封装成对象。
常用的创建线程的方式为第二种
public class ThreadExplain implements Runnable{
private String name;
public ThreadExplain(String name) {
this.name = name;
}
@Override
public void run() {
show();
}
public void show(){
for(int i = 0;i<10;i++){
//Thread.currentThread().getName()获取运行时线程名称
//getName()获取线程名称
//主线程的名称main
System.out.println(name+":name="+Thread.currentThread().getName());
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args){
ThreadExplain t = new ThreadExplain("张三");
ThreadExplain tt = new ThreadExplain("金毛");
Thread t1 = new Thread(t);
Thread t2 = new Thread(tt);
t1.start();
t2.start();
}