线程是在进程基础上的一种划分.
一个进程就表示了一个程序,在一个程序上可以同时运行多个子程序,则这些子程序成为线程.
线程与进程的区别:
多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,有可能互相影响.
线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈.所以说线程的切换比进程的切换负担要小.
一个类只要继承了Thread类, 就表示此类实现了多线程.
一个类中有了run() 如果只是 对象.run() 则只是调用了一个方法而已, 没有启动操作系统的支持, 也就更加不存在多线程的使用了.
要执行多线程的话, 则要调用public void start()
通过start()调用的是子类中的run()方法,此时的程序是交替运行的,不会像直接调用run()那样顺序执行的.
在JDK中, SUN还为我们提供了一个Runnable接口, 实现这个接口,也可以实现多线程.
继承Thread类的子类, 里面都有专门用于启动线程的 start().
在JDK文档中, 可以看到 public Thread (Runnable target){}
在Runnable 和 Thread 都可以实现多线程的情况下, 我们该选谁呢?
还是接口吧, 这是可以解决单继承局限的.
继承了Thread的多个线程之间无法实现资源的共享,而实现了Runnable接口之后,该类的对象 作为 Thread对象创建的实参, 就可以多个线程之间的资源共享.
用Thread继承而来的线程, 一个线程对象只能启动一次, 无论调用多少次start() ,结果都只有一个线程.
实现Runnable 接口的类 相对于Thread 来讲, 有如下好处:
适合多个相干同程序代码的线程去处理同一资源的情况; (比如说火车站的售票系统吧!)
可以避免由于java单继承特性带来的局限;
有利于程序的健壮性,代码能够被多个程序共享.