java实现多线程有两种方法
1、继承Thread类
2、实现Runnable接口
这两种方法的共同点:
不论用哪种方法,都必须用Thread(如果是Thead子类就用它本身)产生线程,然后再调用start()方法。
两种方法的不同点:
1、继承Thread类有一个缺点就是单继承,而实现Runnable接口则弥补了它的缺点,可以实现多继承
2、继承Thread类如果产生Thread实例对象,就必须产生多个Thread实例对象,然后再用Thread产生多个线程;而实现Runnable接口,只需要建立一个实现这个类的实例,然后用这一个实例对象产生多个线程。即实现了资源的共享性
基于以上两点所以建议用第二种方法
下面用例子来做说明
程序1:
程序的运行结果是:
线程A----->运行、、、、
线程B----->运行、、、、
线程A----->运行、、、、
线程B----->运行、、、、
线程A----->运行、、、、
线程B----->运行、、、、
线程A----->运行、、、、
线程B----->运行、、、、
线程A----->运行、、、、
线程B----->运行、、、、
线程A----->运行、、、、
线程C----->运行、、、、
线程B----->运行、、、、
线程C----->运行、、、、
线程B----->运行、、、、
线程C----->运行、、、、
线程B----->运行、、、、
线程A----->运行、、、、
线程C----->运行、、、、
线程B----->运行、、、、
线程A----->运行、、、、
线程C----->运行、、、、
线程B----->运行、、、、
线程A----->运行、、、、
线程C----->运行、、、、
线程A----->运行、、、、
线程C----->运行、、、、
线程C----->运行、、、、
线程C----->运行、、、、
程序2:
程序运行结果:
卖票----->10
卖票----->9
卖票----->8
卖票----->7
卖票----->6
卖票----->5
卖票----->4
卖票----->3
卖票----->2
卖票----->1
把以下代码稍稍改动一下:
程序运行结果发生了如下变化:
卖票----->7
卖票----->7
卖票----->7
卖票----->4
卖票----->4
卖票----->2
卖票----->1
卖票----->0
卖票----->0
卖票----->0