要实现多线程需要先明白什么是多线程?
线程就是进程中的顺序控制流,多线程自然就是同一个进程中有多个顺序控制流了。其实当JVM启动时已经开启了至少两个线程,一个用来执行main函数的线程,另外一个用来进行垃圾回收的线程。
那么如何实现多线程呢?
多线程在java中有两种实现方法,一种是直接继承Thread类,另外一种是实现Runnable接口。
下面通过两个简单的Demo来演示一下
创建线程方式一:继承Thread类重写run方法
步骤:
1、定义一个类继承Thread类
2、覆盖Thread类中的run方法
3,直接创建Thread的子类对象创建线程。
4,调用start方法开启线程并调用线程的任务run方法执行。
实现代码:
class Demo extends Thread
{
public void show(){
for(int x=0;x<10;x++){
System.out.println("x="+x+"......name="+Thread.currentThread().getName());
}
}
public void run(){
show();
}
}
main函数代码:
public static void main(String[] args)
{
Demo d1=new Demo();
Demo d2=new Demo();
d1.start();
d2.start();
System.out.println("over......."+Thread.currentThread().getName());
}
类直接继承Thread的方法在需要启动线程时创建该类对象,然后调用对象中的start方法,则系统自动以多线程的方式执行对象中的run方法,不过这种方式在java中由于类只能单继承,所以有一定的局限性。
创建线程的第二种方式:实现Runnable接口将线程要执行的代码写到run方法中
1,定义类实现Runnable接口。
2,覆盖接口中的run方法,将线程的任务代码封装到run方法中。
3,通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递。
4,调用线程对象的start方法开启线程。
实现代码:
class Demo implements Runnable
{
public void show(){
for(int x=0;x<10;x++){
System.out.println("x="+x+"......name="+Thread.currentThread().getName());
}
}
public void run(){
show();
}
}
调用代码:
public static void main(String[] args)
{
Demo d=new Demo();
Thread t1=new Thread(d);
Thread t2=new Thread(d);
t1.start();
t2.start();
System.out.println("over......."+Thread.currentThread().getName());
}
应用实例
还是经典的出售火车票问题,有四个窗口同时出售火车票。
先是用第一种继承Thread类的方法方法实现
运行结果如下:
从图中可以看出Thread2和Thread3都出售了ticket35,这是由于程序在运行时创建了多个对象,每个对象都通过start来启动,也就是说每个线程都可以出售100张票。所以在实际开发中使用这种方法是需要谨慎的。
接下来是用实现Runnable接口的方法来实现。
运行结果如下:
这种方法由于只创建了一个实例由不同的线程来调用所以没有重复的票。
两种方法都是通过调用Thread类的run方法来实现的。
class Demo implements Runnable//extends Thread
{
private int num=100;
public void run()
{
while(num>0)
{
System.out.println(Thread.currentThread().getName()+"....sale...ticket"+num--);
}
}
}
关于线程安全的问题将在下一篇博客里总结。