---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
一、进程与线程
进程是一个正在执行中的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。
线程就是进程中的一个独立的控制单元。可以说线程在控制着进程的执行。
一个进程中至少有一个线程。
可以通过编译java代码在系统的任务管理器窗口下看到,java虚拟机启动的时候会有一个进程:java.exe。该进程中至少有一个线程负责java程序的执行,而且这个线程运行的代码存在于main方法中。该线程称之为主线程。
其实更细节说明java虚拟机,它启动的不止一个线程,还有负责垃圾回收机制的线程。
二、创建线程
创建线程的方式有两种:
第一种方式:继承Thread类
如何在自定义的代码中,创建一个线程呢?
通过对java api的查找,发现java已经提供了对线程这类事物的描述,就是Thread类。
我们可以通过如下步骤创建一个线程:
1)定义类继承Thread类。
2)复写Thread类中的run()方法。
3)调用线程的start()方法。该方法有两个作用:启动线程,调用run()方法。
注意:启动线程必须调用start()方法,如果仅仅是调用run()方法,那么就成了简单的对象调用方法,而线程创建了却没有启动。
为什么要覆盖run()方法呢?
因为Thread类用于描述线程,该类定义的run()方法,用于存储线程要运行的代码。如果子类没有重写父类的run()方法,那么实例化子类对象时会调用父类的run()方法,并不会编译报错。
例如下面的代码:我们定义了一个ThreadTest类继承Thread类,并复写了Thread类的run()方法。在ThreadDemo类的main方法中创建了两个线程对象:t1和t2,并开启了它们。这时,java虚拟机中至少有3个线程:主线程、t1线程和t2线程。
/**
创建线程演示
自定义ThreadTest类继承Thread类
*/
class ThreadTest extends Thread
{
ThreadTest(){}
ThreadTest(String name){
super(name);
}
//覆盖Thread类中的run()方法
public void run(){
for (int i=0;i<60 ;i++ )
{
//打印结果
System.out.println((Thread.currentThread()==this)+"------"+this.getName()+":+"+i+"+:run()");
}
}
}
class ThreadDemo
{
public static void main(String[] args)
{
//创建线程t1
ThreadTest t1=new ThreadTest("一");
//创建线程t2
ThreadTest t2=new ThreadTest("二");
//开启线程t1
t1.start();
//开启线程t2
t2.start();
//打印主线程的运行结果
for (int i=0;i<60 ;i++ )
{
System.out.println("main:+"+i+"+:Hello World!");
}
}
}
通过比较多次运行的结果可以发现:每次的结果都不相同。这是因为CPU的工作原理所造成的。CPU在执行任务时,它是一个线程一个线程的执行。但是我们平常使用电脑会开启很多线程,并没有这种感觉啊?这是因为CPU在做着快速的切换,以达到看上去是同时运行的效果。CPU执行到谁,谁就运行。我们可以形象的把多线程的运行看做是在互相抢夺CPU的执行权。
这就是多线程的一个特性:随机性。谁抢到CPU的执行权,那么谁就被执行。至于执行多长时间,CUP说了算。
线程的五种状态:
实现Runnable接口创建线程这种方式的好处:
避免了单继承的局限性。也就是说子类在实现Runnable接口的同时还可以继承其它父类。在定义线程时,建议使用实现方式。
实现方式和继承方式的区别:
继承Thread类,线程代码存放在Thread子类的run()方法中;实现Runnable接口,线程代码存放在接口的子类的run()方法中。
三、多线程的同步
1、多线程的安全问题
当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,CPU切换给另一个线程参与进来执行,就会导致共享数据的错误。
导致安全问题的出现的原因:
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>