线程切换
线程切换只有指令的切换,同一个进程内不用进行映射表的切换。
进程切换有指令的切换和映射表的切换。
多线程保留了多进程的有点:并发。
线程生命周期
1.新建状态:new thread
2.就绪状态:start()
3.运行状态:run()
4.阻塞状态:sleep、suspend
5.死亡状态:任务完成或其他终止条件
线程优先级
每一个线程都会都会分配一个优先级NORM_PRIORITY(*)
具有较高优先级的线程对程序重要,并且应该在低优先级的线程之前分配处理器资源。但是不能保证线程执行的顺序,而且非常依赖于平台。
创建线程的方法
1.通过实现Runnable接口
2.通过继承Thread类本身
3.通过Callable和Future创建线程
Thread方法
public void start()线程开始执行
public void run()如果线程使用独立的Runnable运行对象构造,则该调用Runnable对象的run方法
public final void setName(String name)改变线程名称,使之与参数name相同
public final void setPriority(int priority)更改线程的优先级
public final void setDaemon(boolean on)将该线程标记为守护线程或用户线程
public final void join(long millisec)等待该线程终止的最长时间
public void interrupt()终端线程
public final boolean isAlive()测试线程是否处于活动状态
public static void yield()暂停当前正在执行的线程对象,并执行其他线程
public static void sleep(long millisec)在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响
public static boolean holdsLock(Object x)当且仅当当前线程在指定的对象上保持监视器锁时,才返回true
public static ThreadcurrentThread()返回对当前正在执行的线程对象的引用
public static void dumpStack()将当前线程的堆栈跟踪打印至标准错误流
多线程的使用
有效利用多线程的关键是理解程序是并发执行而不是串行执行的。如果创建太多线程,程序执行的效率实际上是降低了。上下文的切换开销也很重要,如果创建了太多的线程,CPU花费在上下文的切换的时间将多于执行程序的时间。