都知道要实现多线程有两种方法1、继承自Thread类 2、实现Runnable接口
前者很好理解,你想拥有某种性质就简单的办法就是继承它。比如你想很有钱,最简单的办法就是你爸是李刚!
由于java是单继承,但这种方法浪费了唯一的宝贵的一个继承的机会,显得很不划算。于是出现了第二种实现
多线程的方法-----实现Runnable接口。这种方式,就显得不那么直接了。我不禁去想,为什么会那么奇妙呢?
这里面有包含什么样的设计理念呢?这后面隐含了什么原理呢?我的思考与理解如下:
Thread类就像一个工厂,他可以制造家具,我们如果想制造家具,有两种方法:
一是,自己也学着造一个同样的工厂,在自己的厂里面制造家具。这就相当于把我们的类继承Thread线程,创建多线程。
二是,我们自己不用开厂,让Thread厂给我们代加工。工厂贴出告示说可以加工一种叫Runnable的木材(Thread构造方法可以接收Runnable参数),
然后我们就拿着自己的Runnable木材到工厂,让工厂给代加工,制造家具。我将这种方式我称为代加工模式。这样是不是很爽?自己想要的家具别人帮忙
制造了。自己可以自由选择开别的厂(继承其他的类)。代加工能实现的前提条件是:Thread工厂可以加工Runnable木材,而你自己也有能被Thread工厂加工的
Runnable木材。
两种创建线程的方式示例代码:
/*
创建线程方式一:继承Thread类。
步骤:
1,定义一个类继承Thread类。
2,覆盖Thread类中的run方法。
3,直接创建Thread的子类对象创建线程。
4,调用start方法开启线程并调用线程的任务run方法执行。
可以通过Thread的getName获取线程的名称 Thread-编号(从0开始)
主线程的名字就是main。
*/
class Demo extends Thread
{
private String name;
Demo(String name)
{
super(name);
//this.name = name;
}
public void run()
{
for(int x=0; x<10; x++)
{
//for(int y=-9999999; y<999999999; y++){}
System.out.println(name+"....x="+x+".....name="+Thread.currentThread().getName());
}
}
}
class ThreadDemo2
{
public static void main(String[] args)
{
/*
创建线程的目的是为了开启一条执行路径,去运行指定的代码和其他代码实现同时运行。
而运行的指定代码就是这个执行路径的任务。
jvm创建的主线程的任务都定义在了主函数中。
而自定义的线程它的任务在哪儿呢?
Thread类用于描述线程,线程是需要任务的。所以Thread类也对任务的描述。
这个任务就通过Thread类中的run方法来体现。也就是说,run方法就是封装自定义线程运行任务的函数。
run方法中定义就是线程要运行的任务代码。
开启线程是为了运行指定代码,所以只有继承Thread类,并复写run方法。
将运行的代码定义在run方法中即可。
*/
//
// Thread t1 = new Thread();
Demo d1 = new Demo("旺财");
Demo d2 = new Demo("xiaoqiang");
d1.start();//开启线程,调用run方法。
d2.start();
System.out.println("over...."+Thread.currentThread().getName());
}
}
//调用run和调用start有什么区别?
package test;
/**
* 创建线程实现方式二、实现Runnable接口
* 需求:简单的卖票程序,多窗口同时卖票
* 步骤:
* 1、定义类实现 Runnbale接口
* 2、覆盖run方法。将多线程要运行的方法放到 run方法中
* 3、通过Thread类创建多线程对象。
* 4、将Runnable接口的子对象作为实际参数传给Thread类
* 5、调用Thread类的start方法开启线程,(会自己调用run方法)
*
* Runnable方式的好处:
* 1、解决了java不能多继承的问题
* 2、很好地将票的资源作为共享资源传入到多个线程。
*/
public class RunnableTest {
public static void main(String[] args) {
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class Ticket implements Runnable{
private int ticket = 100;
public void run() {
while(true){
if(ticket >0 ){
System.out.println(Thread.currentThread().getName()+"买出:"+ticket--);
}
}
}
}}
分享到:
相关推荐
java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题
Java多线程机制 9.1 Java中的线程 9.2 Thread的子类创建线程 9.3 使用Runable接口 9.4 线程的常用方法 9.5 GUI线程 9.6 线程同步 9.7 在同步方法中使用wait()、notify 和notifyAll()方法 9.8 挂起、恢复和终止线程 ...
详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠...
Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程...
java多线程小程序实例 java多线程小程序实例
Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java线程:线程栈模型与线程的变量 12 Java线程:线程的调度-休眠 13 Java线程:线程的调度-优先级 16 Java线程:线程的调度-让步 19 Java线程:线程的...
JAVA多线程使用讲解,如何创建线程,讲解如何使用多线程,以及线程的等待与唤醒。 JAVA多线程使用讲解,如何创建线程,讲解如何使用多线程,以及线程的等待与唤醒。 JAVA多线程使用讲解,如何创建线程,讲解如何使用...
了解Java的多线程机制 掌握创建线程的两个方法 熟悉线程的常用方法 掌握线程同步的意义
Java多线程复习笔记,包括线程创建,关键字讲解,线程池等等。
Java多线程网络爬虫(时光网为例)源码,为maven创建,有不明白请看我的博客介绍;转载请用连接注明出处。近期有人,将本人博客直接复制上传到百度文科等平台,不尊重个人努力成果。
用java语言实现时钟程序,其中用到多线程、swing组件等
《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...
刚学完多线程和线程池,以及线程爱好者。 使用场景及目标: 大文件的快速下载,经测试在100M带宽的网络下,下载一个40M的文件,不超过两秒钟,当然还得根据自己电脑的配置来讲。 其他说明: 文件如果特别小,而...
一个进程可以创建多个线程,线程与线程间的通信方式比较容易。本设计主要是编写一个多线程的网络通信程序,不同的线程处理不同类型的消息,比如有专门处理TCP的线程、专门处理UDP消息的线程等。
Unix操作系统环境下,应用程序可以利用fork... 可以说:Java语言对应用程序多线程能力的支持增强了Java作为网络程序设计语言的优势,为实现分布式应用系统中多客户端的并发访问以及提高服务器的响应效率奠定坚实基础。
Java中的多线程有三种实现方式: 1.继承Thread类,重写run方法。Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法。 2.实现Runnable接口,并...
线程的概念模型 线程的创建和启动 临界资源、对象锁 线程的互斥和同步
java多线程知识点,源代码案例,代码案例中包括如何创建线程,主线程,线程优先级,线程组,线程同步,死锁,线程间的通信知识点