Java多线程--基础(一)
进程和线程
进程
进程是程序的一次执行,是系统运行程序的基本单位,进程是动态的。每个进程会占用CPU时间,内存空间,文件,输入输出设备的使用权。
线程
线程是比进程更小的执行单位。在一个进程中可以产生多个线程。同类的线程共享一个内存空间和一组系统资源。线程切换的负担比进程小得多,因而也叫轻量级进程。
多线程
多线程就是多个线程同时或者交替运行。单核CPU交替运行,多核CPU可以同时运行。
为什么提倡多线程而不是多进程
线程的切换和调度成本远小于进程。
线程的优缺点
- 优点
可以把处理时间长的任务放到后台处理,发挥多喝处理器的优势,让系统运行更快。 - 缺点
- 降低代码可读性
- 更多的线程需要更多的内存空间
- 需要考虑线程安全的问题
多线程中的概念
同步和异步
同步和异步分别形容一次方法调用。
- 同步
调用者必须等待同步方法调用返回才能继续后续操作。 - 异步
异步方法发送开始指令后方法调用会立即返回,调用者可以继续后续操作。
并发和并行
- 并发
并发是指在宏观上多个任务同时进行,在CPU中其实是交替执行的。 - 并行
并行是指多个任务就是同时进行的,在多核CPU中可以实现。
临界区
每次只能被一个线程(进程)访问的共享资源或变量。
阻塞和非阻塞
非阻塞是指在不能立刻得到结果之前,该函数不会阻塞当前线程,而回立刻返回,阻塞与之相反。
创建线程的方式
继承Thread类
public class MyThread extends Thread {
@Override
public void run() {
super.run();
System.out.println("MyThread");
}
}
实现Runnable接口
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("MyRunnable");
}
}
线程池
在实际开发中,建议使用线程池创建线程。
public class ThreadPool {
private static int POOL_NUM = 10;
public static void main(String[] args) {
ExcutorService excutorService = Excutors.newFixedThreadPool(5);
for(int i = 0; i < POOL_NUM; i++) {
RunnableThread thread = new RunnableThread();
excutorService.excute(thread);
}
}
}
class RunnableThrad implements Runnable {
private int THREAD_NUM = 10;
public void run() {
for(int i = 0; i < THREAD_NUM; i++) {
System.out.println("线程" + Thread.curretThread() + " " + i);
}
}
}
线程的生命周期
线程状态
- 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
- 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的成为“运行”。
线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得cpu 时间片后变为运行中状态(running)。 - 阻塞(BLOCKED):表线程阻塞于锁。
- 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
- 超时等待(TIME_WAITING):该状态不同于WAITING,它可以在指定的时间内自行返回。
- 终止(TERMINATED):表示该线程已经执行完毕。
线程的优先级
- 通过setPriority()方法设置线程优先级
- java中线程优先级的范围是1~10
- JDK中使用3个常量预定义优先级
- MIN_PRIORITY = 1
- NORM_PRIORITY = 5
- MAX_PRIORITY = 10
线程优先级的特性
- 继承性
A线程启动B线程,A和B的线程优先级相同 - 规则性
高优先级的线程总是大部分先执行完 - 随机性
优先级高的线程不一定每次都先执行完。
作者:lykxbg —— 来一块小饼干
出处:http://www.cnblogs.com/lykxbg/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。