作为刚起步学习Java的新手乍一看觉得多线程技术是非常牛的技术了~
看了视频教学后,不得不佩服Java的完全面向对象的思想,
它把能够描述的一切都归纳为类,即是是非常非常抽象的东西,甚至是一个思想,一个没有实体的东西,Java也能把它描述归纳为类~~
描述异常和错误,它有类Exception和类Error
描述多线程, 它有Thread
不得不说,Java的确认为万物皆对象.
多线程实现的方式一般有两种,第一种是
1.继承线程的BOSS类Thread,而一个类Thread的对象,就是一个线程!
2.覆盖父类的run()函数,就是子类自己写一个run()函数,run()内部是需要新线程需要执行的代码~
3.建立子类对象,调用子类的start()函数开启线程,这一步很重要,否则建立的线程不会运行~该函数会调用run()函数而执行其中的代码~
这里以窗口卖票~多个窗口卖票就是多线程的例子来写2种方法实现的程序~
class ticket extends Thread
{
static Object obj=new Object(); //静态对象obj保证3个线程用的是同一个锁
private static int tck=50;
public void run()
{
while(true)
{
synchronized(obj) //同步代码块
{
if(tck<1)
break;
System.out.println(currentThread().getName()+"售票:"+tck);
tck--;
}
}
}
}
class ThreadTest2
{
public static void main(String n[])
{
ticket t1=new ticket();
ticket t2=new ticket();
ticket t3=new ticket();
t1.start();
t2.start();
t3.start();
}
}
然后是第二种多线程方式,实现接口式;
类Thread有一个带参数的构造函数为Thread(Runnable r)
他接收一个接口Runnable的对象~而Runnable接口里则有一个成员函数为run(),没错~
这个run()方法就是定义多线程执行内容的函数~
实现接口多线程设计的步骤是:
1.定义一个类实现Runnable接口;
2.重写run函数达到覆盖的目的;
3.创建Thread类的对象建立多线程;
4.将Runnable的子类对象作为实参传入Thread(Runnable r)构造函数中~.
5.通过Thread类的对象调用start()函数,开启多线程并执行Runnable子类中的run函数.
下面通过实现方式来重写卖票的例子..
class tck implements Runnable //实现接口Runnable
{
Object o=new Object();
private int num=2000;
public void run() //重写run方法
{
while(true)
{
synchronized(o) //同步数据代码块
{
if(num<1)
break;
System.out.println(Thread.currentThread().getName()+"售出票:"+num);
num--;
}
}
}
}
class ThreadTest3
{
public static void main(String ss[])
{
tck t=new tck(); //建立一个需要多线程处理类的对象,这样其成员变量值就唯一了.
Thread t1 =new Thread(t,"窗口1");
Thread t2 =new Thread(t,"\t\t\t\t窗口2");
Thread t3 =new Thread(t,"\t\t\t\t\t\t\t\t窗口3");
Thread t4 =new Thread(t,"\t\t\t\t\t\t\t\t\t\t\t\t窗口4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
实现接口实现比继承实现其实更加方便,
因为Java是单一继承,若继承了Thead类便无法继承其他类,而实现接口是实现了一个接口,是class ... extends .. implements ...的模式.
两种方法较为明显的不同就是存放run方法代码的位置不同.
继承实现方式是把run方法的代码放在了Thread的子类的run函数中,
而实现接口方式则是把run方法的代码放在了Runnable的子类的run函数中,通过Thread(Runnable r)的构造方式来把run()函数传入Thread的对象达到多线程的目的,