方法
说明
setPriority(int newPriority)
更改线程的优先级
static void sleep(long millis)
在指定的毫秒数内让当前正在执行的线程休眠
void join()
等待该线程终止
static void yield()
暂停当前正在执行的线程对象,并执行其他线程
void interrupt()
中断线程,别用这个方式
boolean isAlive()
测试线程是否处于活动状态
停止线程
不推荐使用JDK提供的stop(), destroy()方法
推荐线程自己停止
建议使用标志位flag,flag=false时,终止线程运行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public class TestThread03 implements Runnable { private boolean flag = false ; @Override public void run () { while (!flag){ System.out.println("我在看片" ); } } public void stop () { this .flag = true ; System.out.println("不看了" ); } public static void main (String[] args) { TestThread03 testThread3 = new TestThread03(); new Thread(testThread3).start(); for (int i = 0 ; i < 200 ; i++) { if (i == 100 ) testThread3.stop(); System.out.println("我在学习" + i); } } }
线程休眠
sleep(时间)指定当前线程阻塞的毫秒数
sleep存在异常InterruptedException
sleep时间达到后线程进入就绪状态
sleep可以模拟网络延时,倒计时等
每一个对象都有一个锁,sleep不会释放锁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package com.sympa.lesson01;public class Tickets01 implements Runnable { private int ticket = 10 ; @Override public void run () { while (true ) { if (ticket <= 0 ) break ; try { Thread.sleep(100 ); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "拿到了第" + ticket-- + "张票" ); } } public static void main (String[] args) { Tickets01 tickets01 = new Tickets01(); new Thread(tickets01, "黄牛1号" ).start(); new Thread(tickets01, "黄牛2号" ).start(); new Thread(tickets01, "黄牛3号" ).start(); } }
线程礼让
礼让线程,让当前正在执行的线程暂停,但不阻塞
让线程由运行状态转为就绪状态
让CPU重新调度,礼让不一定成功,看CPU心情
线程强制执行Join
Join合并线程,待此线程执行完成后,再执行其它线程,其它线程阻塞
可以想象成插队
观测线程状态 Thread.State 线程状态,线程可以处于以下状态之一:
NEW:尚未启动的线程处于此状态
RUNNABLE:在Java虚拟机中执行的线程处于此状态
BLOCKED:被阻塞等待监视器锁定的线程处于此状态
WAITING:正在等待另一个线程执行特定动作的线程处于此状态
TIMED_WAITING:正在等待另一个线程执行动作达到指定等待时间的线程处于此状态
TERMINATED:已退出的线程处于此状态
一个线程可以在给定时间点处于一个状态,这些状态是不反映任何操作系统线程状态的虚拟机状态
线程优先级
Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有课程,线程调度器按照优先级决定应该调度哪个线程来执行
线程的优先级用数字表示,范围从1~10
Thread.MIN_PRIORITY = 1;
Thread.MAX_PRIORITY = 10;
Thread.NORM_PRIORITY = 5;
使用getPriority().setPriority(int xxx)来改变或获取优先级
优先级的设定建议在start()调度前
优先级低只是意味着获得调度的概率低,并不是优先级低就不会被调用,都是看CPU的调度(性能倒置)
守护(daemon)线程
线程分为用户线程和守护线程
虚拟机必须确保用户线程执行完毕
虚拟机不用等待守护线程执行完毕
如,后台记录操作日志,监控内存,垃圾回收等
1 2 3 Thread thread = new Thread(); thread.setDaemon(true ); thread.start();