------- android培训、java培训、期待与您交流! ----------
线程顾名思义就是进程中的一个独立控制点,是控制进程执行的一个路径。即:一个进程至少有一个或者多个线程控制着其运行。
线程在Java中的定义有两种方法:
一是继承了Thread的使用方法即是继承了Java中的Thread类,要使Java中的线程正常启动,首先在子类中要复写Thread类中的run方法,并且在创建线程对象中调用start方法,开启线程。根据教学视频老师所举的售票例子说说自己的体会。
列如:代码如下
/*
多线程:举例练习关于车站窗口卖票问题
实例:四个窗口卖10张票单,需要四个窗口同步进行。
*/
class Ticket extends Thread//创建子类继承Thread,定义线程
{
private int tick=10;
public void run()//覆盖Thread类中的run方法
{
while (tick>0)
{
System.out.println("当前窗口:"+Thread.currentThread().getName()+"\t售票号码:"+tick--);
}
}
}
class SaleThreadDemo
{
public static void main(String[] args)
{
Ticket t1=new Ticket();//创建Ticket对象
Ticket t2=new Ticket();
Ticket t3=new Ticket();
Ticket t4=new Ticket();
t1.start();//开启线程
t2.start();
t3.start();
t4.start();
}
}
在这段简短的代码中共有五个线程控制这程序的运行,运行结果显示如下图:
但是这样会有大量重复的号码出现,如:Thread-2是9号,Thread-3也是9号,出现这样的原因是因为每个线程都有个独立的运行空间,且没有达到tick变量的数据共享,所以在解决这个问题的方式上便想着将tick静态使其数据共享。将private int tick=10;改为private static int tick=10;后运行结果如下:
虽说这样能够解决号码重复问题,但是由于将变量静态后,其生命周期较长,占用方法区内存时间过长,所以不建议使用通过静态共享数据方式解决这个问题,由此便通过第二种方式定义线程,实现接口Runnable。修改代码如下:
class Ticket implements Runnable //实现Runnable接口,定义线程
{
private int tick=10;
public void run()//覆盖Runnable接口中的run方法
{
while (tick>0)
{
System.out.println("当前窗口:"+Thread.currentThread().getName()+"\t售票号码:"+tick--);
}
}
}
class SaleThreadDemo
{
public static void main(String[] args)
{
Ticket t=new Ticket();//创建Ticket对象
Thread t1=new Thread(t);//创建线程类对象,并将Ticket对象t传递给Thread类中的构造函数Thread(Runnable p)
Thread t2=new Thread(t);
Thread t3=new Thread(t);
Thread t4=new Thread(t);
t1.start();//开启线程
t2.start();
t3.start();
t4.start();
}
}
第二种方式代码运行结果如下:
其实第二种定义方式与第一种定义方式区别在与:第一种方式是直接继承Thread类,并将运行代码存放在Thread类的run方法中;第二种方式是将运行代码放在Runnable接口的run方法中。而runnable接口通过与Thread的Thread(Runnable p)产生联系。进而开启线程的方式都是通过Thread类的start方法开启。
通过实现的方式创建线程相比于继承方式的好处就是避免了继承的局限性,实际开发建议使用实现方式定义线程。
这就是我初涉线程所学到的部分知识,期待与大家交流。