在谈线程之前,我先简单说说什么是线程,在一个操作系统中,每一个独立运行的程序都可以成为一个进程,也就是正在运行的程序目前大部分计算机上都能够同时执行多个程序这就是多线程。 线程的两种实现方式1:一种是继承java.lang包下的Thread类,复写thread类的run方法在run中实现在线程上的代码 ,方式2:实现java.lang.runable接口,同样实在run中实现在线程上的代码 。
既然直接继承thread类和实现runnale接口都能实现多线程,那么这两种方式有什么区别,我来说一下。
按毕老师举得例子就是买票的例子
public class xianCheng
{
public static void main(String []args)
{
new window().start();//创建一个线程对象window并开启
new window().start();//创建一个线程对象window并开启
new window().start();//创建一个线程对象window并开启
new window().start();//创建一个线程对象window并开启
}
}
class window extends Thread
{
private int piao=100;
public void run()
{
while(ture)
{
if(piao>o)
{
Thread th=new Thread();
String thname=th.getName();
System.out.println(thname+"正在发售"+piao+“张票”)
}
}
}
}
运行的结果为线程1发了100张票线程2发了100张票线程3发了100张票线程4发了100张票,和实际情况一点也不一样,它原理是创建了4个线程每个线程都买了100个票,我们在看看另一种方式
public class xianCheng
{
public static void main(String []args)
{
window w=new window;
new Thread(w,"窗口1").start()//创建线程对象命名窗口1开启线程
new Thread(w,"窗口2").start()//创建线程对象命名窗口2开启线程
new Thread(w,"窗口3").start()//创建线程对象命名窗口3开启线程
new Thread(w,"窗口4").start()//创建线程对象命名窗口4开启线程
}
}
class window implements Runnable
{
private int piao=100;
public void run()
{
while(true)
{
if(piao>0)
{
Thread th=thread.currenthread();
String thname=th.getname()
sop(thname+"正在发售"+piao+"张票")
}
}
}
}
这个方法中只创建了一个对象然后创建4个线程,每个线程都调用方法,保证4个线程都访问同一个变量
通过两个例子可以看出实现eunnable接口相对于继承thread有以下好处
1:合适多个相同的程序代码去处理同一个资源的情况,把线程同代码,数据有效的分离很好的体现面向对象的设计思想
2:可以避免由于java的单继承带来的局限性。在开发中经常碰到这种情况,就是使用一个已经继承了某个累的子类创建线程,由于一个类不能有两个父类,所以不能用继承thread类的方式,那么就只能采用runnable接口的方式。
事实上,在开发中大部分都会采用第二种方式创建多线程,实现runnable接口。
|
|