都知道要实现多线程有两种方法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--);
}
}
}
}}