阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第1章:Java多线程编程:课时5:Thread与Runnable关系
程序员文章站
2022-05-05 22:48:56
...
经过一系列的分析之后可以发现,在多线程的实现过程之中已经有了两种做法:Thread类、Runnble接口,如果从代码的结构本身来讲肯定使用Runnable是最方便的,因为其可以避免单继承的局限,同时也可以更好的进行功能的扩充。
但是从结构上也需要来观察Thread与Runnable的联系,打开Thread类的定义:
public class Thread extends Object implements Runnable {}
发现现在Thread类也是Runnable接口的子类,那么在之前继承Thread类的时候实际上覆写的还是Runnable接口的run()方法,于是此时来观察一下程序的类结构。
class MyThread implements Runnable { // 线程的主体
private String title ;
public MyThread(String title) {
this.title = title ;
}
@Override
public void run() { // 线程的主体方法
for (int x = 0; x < 10; x++) {
System.out.println(this.title + "运行,x = " + x) ;
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
Thread threadA = new Thread(new MyThread("线程对象A"));
Thread threadB = new Thread(new MyThread("线程对象B"));
Thread threadC = new Thread(new MyThread("线程对象C"));
threadA.start(); // 启动多线程
threadB.start(); // 启动多线程
threadC.start(); // 启动多线程
}
}
多线程的设计之中,使用了代理设计模式的结构,用户自定义的线程主体只是负责项目核心功能的实现,而所有的辅助实现全部交由Thread类来处理。
在进行Thread启动多线程的时候调用的是start()方法,而后找到的run()方法,当通过Thread类的构造方法传递了一个Runnable接口对象的时候,那么该接口对象将被Thread类中的target属性所保存;在start()方法执行的时候会调用Thread类中的run()方法,而这个run()方法去调用Runnable接口子类被覆写过的run()方法。
多线程开发的本质实质上是在于多个线程可以进行同一资源的抢占,那么Thread主要描述的是线程,而资源的描述是通过Runnable完成的。
范例:利用卖票程序来实现多个线程的资源并发访问
package cn.mldn.demo;
class MyThread implements Runnable { // 线程的主体
private int ticket = 5 ;
@Override
public void run() { // 线程的主体方法
for (int x = 0; x < 100; x++) {
if (this.ticket > 0) {
System.out.println("卖票,ticket = " + this.ticket --) ;
}
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
MyThread mt = new MyThread() ;
new Thread(mt).start(); // 第一个线程启动
new Thread(mt).start(); // 第二个线程启动
new Thread(mt).start(); // 第三个线程启动
}
}
通过内存分析图来分析本程序的执行结构。
上一篇: Java多线程13 妖的出现
下一篇: 安装zabbix 出现的版本过低现象
推荐阅读
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第22章:反射应用案例:课时101:反射实例化对象
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第24章:反射与简单Java类:课时111:单级属性赋值
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第18章: 输入与输出支持:课时84:打印流
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第22章:反射应用案例:课时102:反射与工厂设计模式
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第16章:字节流与字符流:课时75:Writer字符输出流
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第17章: IO操作深入:课时83:RandomAccessFile
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第26章:反射与代理设计模式:课时118:动态代理设计模式
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第23章:反射与类操作:课时105:反射调用构造方法(含关系图-重要)
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第17章: IO操作深入:课时82:管道流
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第25章:ClassLoader类加载器:课时115:ClassLoader类加载器简介