1.继承Thread类
public class MyThread_1 extends Thread {
private int ThreadId;
private int runCount;
private String ImplementMethod = "继承Thread类";
private int workCount;
public MyThread_1(int i,int workCount){
this.ThreadId = i;
this.runCount = 0;
this.workCount = workCount;
}
@Override
public void run(){
for (int i = 0; i < workCount; i++) {
runCount++;
System.out.println("实现方法:\t"+
this.ImplementMethod+
"\t当前线程\t"+this.ThreadId+
"\t运行次数:"+runCount);
}
}
}
2.实现Runnable接口
public class MyThread_2 implements Runnable {
private int ThreadId;
private int runCount;
private String ImplementMethod = "实现Runnable接口";
private int workCount;
public MyThread_2(int i,int workCount){
this.ThreadId = i;
this.runCount = 0;
this.workCount = workCount;
}
@Override
public void run() {
for (int i = 0; i < workCount; i++) {
this.runCount++;
System.out.println("实现方法:\t"+
this.ImplementMethod+
"\t当前线程\t"+this.ThreadId+"\t运行次数:"+
runCount);
}
}
}
多线程运行方法
public class MultiThread {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
MyThread_1 myThread_1 = new MyThread_1(i,10);
MyThread_2 myThread_2 = new MyThread_2(i,10);
//运行方法上存在区别
myThread_1.start();
new Thread(myThread_2).start();
}
}
}
tips:每次运行的结果可能不同;
两种方法的区别
- java 只能继承一个父类,但能同时实现多个接口,所以说实现Runnable接口的方法可扩展性更好些。
- runnable执行时需要包裹Thread()
两种方法的共性
- Thread类底层也实现了Runnable接口
- 都需要覆写run方法
- 除了Runnable接口还可以实现Callable接口实现多线程(Callable可以有返回值,当Callable接口执行完后得到一个Future对象可以通过get方法得到返回结果)
小问题
创建好的线程不能反复调用start()
。要不会报错:IllegalThreadStateException
这是由于线程的的生命周期决定的,线程的生命周期:
- 创建:start()方法创建线程。
- 运行:执行线程任务。
- 阻塞:线程被阻塞,暂停执行线程任务。
- 死亡:线程执行
stop()
方法,工作栈被销毁。
只有运行和阻塞状态可以相互转换。其他状态不可逆。