多线程:减轻编写交互频繁、涉及面多的程序的难度;充分利用计算机资源。
一个操作系统,可以有多个进程,每个进程上边会有多个线程。一个程序的运行至少启动两个线程:main线程和gc(守护)线程。
线程分为前台线程和后台线程(守护线程):
对Java程序来说,只要有一个前台线程在运行,这个进程就不会结束;
如果一个进程只有后台线程在运行,这个进程就会结束;
如果某个线程对象在启动(调用start()方法)之前调用setDaemon(true);方法,这个线程就变成了后台线程。
线程的状态转换:
* 多线程的方法有两种:
1、继承Thread类,并重写run()方法;
2、实现Runnable接口。
虽然有两种不同的方法,但是它们的多线程启动方法是相同的,都是同归Thread类来启动多线程的[p.start();]。
start使盖县程开始执行是指Java虚拟机调用该线程的run()方法;
start只是使线程就绪,什么时候开始执行由CPU决定。
线程只能启动一次;如果启动多次,程序在编译时不会出现错误,但是执行时会出现错误。
两种方法的不同在于:
方法1的缺点:Java为单继承,当一个想实现多线程的类继承了Thread类后就不可以再继承其他类,这样就不灵活,没有扩展性了;
方法2的优点:实现Runnable接口不仅可以再继承其他类,还可以实现资源共享。
总之实现Runnable接口比继承Thread类要更好一些,所以尽量要使用Runnable而不用Thread。
下面就这两种方法举例说明:
方法1,继承Thread类,重写run()方法。
(每隔一秒打印一行,打印完后程序结束)