线程与进程

  • 进程是一个独立的运行环境、一个程序可以有多个进程
  • 线程是一个执行单元,一个进程可以有多个线程
  • 多线程的运行是由CPU决定的,根据CPU的核数,决定同时能有几个线程执行

如何使用线程

  • Thread
  • Runnable
  • 建议使用Runnable,避免单继承的局限性
  • 关闭线程
    • Stop()方法,强制关闭,但会抛出异常,已过时
    • 通过标记,正常退出

线程池

  • 多线程的时候,可以复用线程对象执行任务,节省内存空间,提高执行效率
  • SingleThreadExecutor:
    • 单工作线程;
    • SingleThreadExecutor只会用唯一的工作线程来执行任务,
    • 保证所有任务按照指定顺序(FIFO、LIFO、优先级)执行。
    • 如果提交了多个任务,那么这些任务将会排队,每个任务都会在下一个任务开始之前运行结束;
    • 如果一个线程异常结束,会有另一个取代它,保证顺序执行。
    • 单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。
  • FixedThreadExecutor:
    • 指定工作线程数量线程池;
    • 每提交一个任务就是一个线程,直到达到线程池的最大数量,
    • 然后后面进入等待队列直到前面的任务完成才继续执行;
    • FixedThreadExecutor具有线程池提高程序效率和节省创建线程时所耗的开销的优点。
    • 但是,在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源。
  • CacheThreadExecutor:
    • 可缓存线程池;推荐使用;
    • 如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),
    • 则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。
    • 该线程池比较适合没有固定大小并且比较快速就能完成的小任务,它将为每个任务创建一个线程。
  • ScheduleThreadExecutor:
    • 定长线程池;
    • 支持定时及周期性任务执行。
  • ThreadPoolExecutor

synchronized

ThreadLocal

sleep与wait

  • sleep是Thread的静态方法,而wait()是Object的成员方法;
  • sleep释放资源不释放锁,而wait释放资源释放锁;
  • 使用范围:wait、notify和notifyAll只能在同步方法或者同步块里面使用,而sleep可以在任何地方使用;
  • wait通常被用于线程间交互,sleep通常被用于暂停执行;
  • 谁调用sleep方法谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉;