线程与进程
- 进程是一个独立的运行环境、一个程序可以有多个进程
- 线程是一个执行单元,一个进程可以有多个线程
- 多线程的运行是由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去睡觉;