Thread源码 多线程趣味讲解
根据韩顺平老师课程做的笔记
***1、继承阶级
一个类继承Thread类 改类就可以当作线程使用
***2、继承衣钵
重写run方法
***3、实现家业
run Thread类实现了Runnable接口 run方法
简单使用案例一:
说明: 当main线程启动一个子线程thread-0 主线程不会阻塞,会继续执行
一、使用继承Thread
package com.company.duoxiancheng.review;
public class Thread01 {
public static void main(String[] args) {
cat cat1 = new cat();
cat1.start(); //启动线程
}
}
class cat extends Thread{
int num=0;
@Override
public void run(){ //重写run方法 写上业务逻辑
while (true){
//线程每隔上一秒 在控制台输出“喵喵喵”
System.out.println("喵喵我是zjq"+(++num));
//休息一秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (num==8){
break;
}
}
}
}
4、在继承家业的过程中 ,如果从家里面(main主函数) 每个人都获取了,都是败家子儿 没有一家花完最后一个子 那说明这个家业还在,只有花完最后一个子儿了 这个家业就是穷光蛋了
当然不光有儿子败家 万一还有孙子呢 ,反正不到最后一个子 这个进程就不会挂掉
2、启动线程为什么不使用run()方法 而用 start()方法
.start() 会启动线程 最终会执行run()方法
run() 就是一个普通的方法 执行起来和主线程就是串行执行
只有当run()方法执行完成才会执行其他的方法
说明:当main线程启动一个子线程 Thread-0 主线程就不会阻塞,会
继续执行
这时 主线程和子线程是交替执行
真正实现多线程的效果 是start()
二、通过实现Runnable接口
重写run()方法 不能直接使用run()!!!
package com.company.duoxiancheng.review;
public class Thread02 {
public static void main(String[] args) {
Dog dog = new Dog();
//dog.start();这里不能调用start
//创建Thread对象 把dog对象
//设计模式:这里使用的是静态代理模式
Thread thread=new Thread(dog);
thread.start();
}
}
class Dog implements Runnable{
int count = 0;
@Override
public void run() {
while (true){
System.out.println("小狗汪汪叫"+(++count)+Thread.currentThread().getName());
//休眠1s
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (count ==10){
break;
}
}
}
}
补充:设计模式-静态代理
模拟静态代理
我不能做的事 我交给你来帮我做
package com.company.duoxiancheng.review;
public class Thread02 {
public static void main(String[] args) {
// Dog dog = new Dog();
// //dog.start();这里不能调用start
// //创建Thread对象 把dog对象
// //设计模式:这里使用的是静态代理模式
// Thread thread=new Thread(dog);
// thread.start();
Tiger tiger = new Tiger();
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{
private Runnable target = null;
@Override
public void run() {
if (target!=null){
target.run();
}
}
public ThreadProxy(Runnable target){
this.target = target;
}
public void start(){
start0(); //这个方法是最重要的启动线程的方法
}
public void start0(){
run();
}
}