15Java进阶 进程
1 线程控制
t.join():让主线程进入线程池,等待t执行完才执行。
t.sleep():让线程阻塞,休眠一段时间,休眠结束后进入就绪状态。不会释放锁。
t.yield():让线程让出CPU,从运行态进入就绪态。可能会接着进入运行态。
t.setDaemon():设置为守护线程,非守护线程都死了的时候自动终止。
2 线程的分类
线程分为:守护线程 用户线程
-
守护线程和用户线程基本上是相同的,唯一区别就是判断JVM何时离开
-
守护线程是用来服务用户线程的。通过在start方法之前调用thread.setDaemon(true) 可以将一个用户线程变成守护线程
-
java的垃圾回收 他是一个典型的守护线程
-
如果JVM中都是守护线程,JVM将退出(用户线程执行结束 守护线程无论是否结束 都将终止执行)
3 线程的生命周期
jdk中用Thread State定义了线程的状态:
-
线程状态。线程可以处于以下状态之一:
-
NEW
尚未启动的线程处于此状态。 -
RUNNABLE
在Java虚拟机中执行的线程处于此状态。 -
BLOCKED
被阻塞等待监视器锁定的线程处于此状态。 -
WAITING
正在等待另一个线程执行特定动作的线程处于此状态。 -
TIMED_WAITING
正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。 -
TERMINATED
已退出的线程处于此状态。
线程的状态通常分为5种状态:
新建:当一个Thread类及其子类的对象被声明并创建时,此时的线程对象就处于新建状态
就绪 : 处于新建状态的线程被start后,线程将进入CPU的执行队列等待获得CPU的执行权,此时的线程已经具备了运行的条件,只是还有获得CPU的执行权
运行:当就绪的线程获得CPU的执行权 ,处于运行状态
阻塞:在某种特殊的情况下,被人为挂起或执行输入输出操作时,让出CPU并临时中止自己的执行。此时线程就进入阻塞状态
死亡:线程完成了他的全部工作或被线程被提前强制性的终止 或出现异常导致线程异常结束。
线程状态之间的相互转换
-
一个线程一旦死亡 是不可以在重新启动的。
4.线程同步
public class SellTicketDemo { public static void main(String[] args) { SellTicket st = new SellTicket(); //创建三个线程 Thread t1 = new Thread(st,"1号窗口"); Thread t2 = new Thread(st,"2号窗口"); Thread t3 = new Thread(st,"3号窗口"); //启动线程 t1.start(); t2.start(); t3.start(); } } public class SellTicket implements Runnable{ private int ticktes = 100; @Override public void run() { while(true){ if(ticktes > 0 ){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"正在出售第" + ticktes+"张票");//会出现数据不同步的现象,与实际需求不符 ticktes--; } } } }