- 使用继承Thread类来创建线程
- 案例:
1.请编写程序,开启一个线程,该线程每隔一秒,在控制台输出:“喵喵,我是小猫咪”
2.对上题进行改进:当输出80次喵喵我是小猫咪,结束该线程
3.使用 JConsole监控线程执行情况,并画出程序示意图
- 代码演示
import java.sql.Time;
public class Thread01 {
public static void main(String[] args) throws InterruptedException {
cat cat = new cat();
cat.start();//启动线程:最终会执行 cat的run方法,如果直接用cat.run的话,是不会启动Thread0线程的,就相当于run方法变成了普通的方法!
//而且cat.run只有当run方法执行完毕后,才会往下执行,没有真正启动线程,变成了串行化的执行。
//说明:当main线程启动一个子线程Thread-0,主线程不会阻塞,会继续执行
System.out.println("主线程会继续执行不会阻塞"+Thread.currentThread().getName());//main
for (int i = 0; i <60 ; i++) {
System.out.println("主线程i="+i);
//让主线程休眠
Thread.sleep(1000);
}
}
}
//注意:当一个类继承了Thread类,该类就可以当做线程使用。
//我们会重写run方法,,写上自己的业务代码。
//run Thread类,实现了Runnable接口的run方法。
class cat extends Thread{
@Override
public void run() {//重写run方法,写上自己的业务逻辑
int times = 1;
while (times<=80){
System.out.println("喵喵,我是小猫咪"+" "+times+"线程名称"+Thread.currentThread().getName());
try {
//让该线程休眠一秒
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
times++;
}
}
}
使用实现Runndble接口来创建线程
说明:java是单继承的,在某些情况下一个诶可能已经继承了某个父类,这时再用继承Thread类方法来创建线程显然是不可能的!
所以java设计者们提供了另外一个方式创建线程,就是通过实现Runnable接口来创建继承
- 应用案例:请编写程序,该程序可以每隔一秒在控制台输出 “ hi’!”,当输出10次后自动退出,注意请使用实现Runnable接口的方法来创建线程。(静态代理)
package com.yuecheng.hspedu.Runnable00;
public class Thread02 {
public static void main(String[] args) {
dog dog = new dog();
//dog.start();这里不能调用start
//创建Thread对象,把dog对象放入(已经实现Runnable接口)放入Thread,这个对象是有start方法的!!
Thread thread = new Thread(dog);//这里使用了静态代理模式
thread.start();
}
}
class dog implements Runnable{//通过实现Runnable接口开发线程。
int count = 1;
@Override
public void run() {//普通方法
while (count<=10){
System.out.println("hi !"+Thread.currentThread().getName()+count++);
//休眠一秒(1000ms)
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
- 静态代理的实现原理
package com.yuecheng.hspedu.Runnable00;
// 代码模拟实现Runnable接口,开发线程的机制
public class Runnable03 {
public static void main(String[] args) {
Tiger tiger = new Tiger();// 实现了Runnable接口
ThreadProxy threadProxy = new ThreadProxy(tiger);
threadProxy.start();
}
}
class Animal{}
class Tiger extends Animal implements Runnable{
@Override
public void run() {
System.out.println("老虎叫: 啊啊啊");
}
}
//线程代理类,模拟了一个极简的Thread类
class ThreadProxy implements Runnable{//你可以把ThreadProxy类当做Thread
private Runnable target = null;//属性,类型是Runnable
@Override
public void run() {
if (target!=null){
target.run();//动态绑定(运行类型Tiger)
}
}
// 构造器接收Runnable接口的类型
public ThreadProxy(Runnable target) {//把实现了Runnable接口的一个对象给ThreadProxy
this.target = target;
}
public void start(){//这个方法是ThreadProxy里的,start()方法在调用start0(),再调用run,实现调出线程
start0();//这个方法是真正实现多线程的方法!
};
public void start0(){//注:这是自己模拟的,所以没有底层实现,是创建不了线程的。真正实现多线程的是Thread里的start0()方法。
run();
};
}



