线程的生命周期 Thread类内部有个public的枚举Thread.State,里边将线程的状态分为:
NEW-------新建状态,至今尚未启动的线程处于这种状态。
RUNNABLE-------运行状态,正在 Java虚拟机中执行的线程处于这种状态。
BLOCKED-------阻塞状态,受阻塞并等待某个监视器锁的线程处于这种状态。
WAITING-------冻结状态,无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。
TIMED_WAITING-------等待状态,等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。
TERMINATED-------已退出的线程处于这种状态。
如何停止线程? 只有一种,run方法结束。
开启多线程运行,运行代码通常是循环结构。
只要控制住循环,就可以让run方法结束,也就是线程结束。
控制线程 join方法:调用join方法的线程对象强制运行,该线程强制运行期间,其他线程无法运行,必须等到该线程结束后其他线程才可以运行。 有人也把这种方式成为联合线程 join方法的重载方法: join(long millis): join(long millis,int nanos): 通常很少使用第三个方法: 程序无须精确到一纳秒; 计算机硬件和操作系统也无法精确到一纳秒; class MyThreadDemo implements Runnable{ @Override public void run() { for (int i = 0; i< 50; i++) { System.out.println(Thread.currentThread().getName()+"正在运行!"+i); if(i == 25){ try { new Thread(newMyThreadDemo()).join(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } public class DemoRe10 { public static void main(String[] args) { new Thread(newMyThreadDemo()).start(); new Thread(newMyThreadDemo()).start(); } } Daemon 后台线程:处于后台运行,任务是为其他线程提供服务。也称为“守护线程”或“精灵线程”。JVM的垃圾回收就是典型的后台线程。 特点:若所有的前台线程都死亡,后台线程自动死亡。 设置后台线程:Thread对象setDaemon(true); setDaemon(true)必须在start()调用前。否则出现IllegalThreadStateException异常; 前台线程创建的线程默认是前台线程; 判断是否是后台线程:使用Thread对象的isDaemon()方法; 并且当且仅当创建线程是后台线程时,新线程才是后台线程。 sleep 线程休眠: 让执行的线程暂停一段时间,进入阻塞状态。 sleep(long milllis) throws InterruptedException:毫秒 sleep(long millis,int nanos) throws InterruptedException:毫秒,纳秒 调用sleep()后,在指定时间段之内,该线程不会获得执行的机会。 控制线程之优先级 每个线程都有优先级,优先级的高低只和线程获得执行机会的次数多少有关。 并非线程优先级越高的就一定先执行,哪个线程的先运行取决于CPU的调度; 默认情况下main线程具有普通的优先级,而它创建的线程也具有普通优先级。 Thread对象的setPriority(intx)和getPriority()来设置和获得优先级。 MAX_PRIORITY : 值是10 MIN_PRIORITY : 值是1 NORM_PRIORITY : 值是5(主方法默认优先级) yield 线程礼让: 暂停当前正在执行的线程对象,并执行其他线程; Thread的静态方法,可以是当前线程暂停,但是不会阻塞该线程,而是进入就绪状态。所以完全有可能:某个线程调用了yield()之后,线程调度器又把他调度出来重新执行。
|