我们知道进程是指一个内存中运行的程序,每个进程都有自己独立的内存空间。而线程是指进程中的一个执行流程,一个进程中可以有对个线程。在操作系统中,线程是能独立调度和分配的基本单位。在这里我就不过多的讲解了,有兴趣的可以去看看下面的链接http://baike.baidu.com/view/1053.htm?fr=aladdin。
现在重点讲讲JAVA中的线程。
线程Thread是java.lang下的一个类。当java虚拟机启动时,通常会调用一个非守护线程即某个指定类的main()方法。每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新 Thread
对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。 所谓的守护线程是指调用了setDeamon()方法的线程,即后台线程。这个方法的调用必须在start()方法之前,因为线程在被创建时默认的设置为前台线程。守护线程的功能:为非后台线程服务。(例如垃圾回收的精灵线程)如果前台线程全部结束,则后台线程也随即结束,然后JVM退出;否则后台的守护线程将一直执行。
创建新执行线程有两种方式。一种是将类声明为Thread的子类,在类中重写run()方法。
一种是声明实现Runnable接口的类。
线程类写好后就可以创建并启动线程了。
以上两种方式的区别: 使用继承Thread类的方式创建线程简单明了,但是它有一个缺点,如果定义的类已经继承其他类则无法再继承Thread类。
实现Runnable接口比继承Thread类所具有的优势: 1):适合多个相同的程序代码的线程去处理同一个资源 。
2):可以避免java中的单继承的限制。
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。
线程Thread的构造方法:
Thread() 分配新的 Thread
对象。
Thread(Runnable target) 分配新的 Thread
对象。
Thread(Runnable target,String name) 分配新的 Thread
对象。
Thread(String name) 分配新的 Thread
对象。
Thread(ThreadGroup,Runnable target)分配新的 Thread
对象。
Thread(ThreadGroup,Runnable target,String name) 分配新的 Thread
对象,以便将 target
作为其运行对象,将指定的 name
作为其名称,并作为 group
所引用的线程组的一员。
Thread(ThreadGroup,Runnable target,String name,long stackSize) 分配新的 Thread
对象,以便将 target
作为其运行对象,将指定的 name
作为其名称,作为 group
所引用的线程组的一员,并具有指定的堆栈大小。
Thread(ThreadGroup,String name)分配新的 Thread
对象。
线程常用的方法:
start() 使该线程开始执行;Java 虚拟机调用该线程的 run
方法。
sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
sleep(long millis,int nanos) 在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
yield() 暂停当前正在执行的线程对象,并执行其他线程。
join() 等待调用该方法的线程终止。
join(long millis) 等待该线程终止的时间最长为 millis
毫秒。
join(long millis,int nanos) 等待该线程终止的时间最长为 millis
毫秒 + nanos
纳秒。
run() 如果该线程是使用独立的 Runnable
运行对象构造的,则调用该 Runnable
对象的 run
方法;否则,该方法不执行任何操作并返回。
currentThread() 返回对当前正在执行的线程对象的引用。
getName() 返回该线程的名称。
getState() 返回该线程的状态。
当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main
方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止:
- 调用了
Runtime
类的exit
方法,并且安全管理器允许退出操作发生。 - 非守护线程的所有线程都已停止运行,无论是通过从对 run 方法的调用中返回,还是通过抛出一个传播到
run
方法之外的异常。