综述
并发编程的挑战:
- 上下文切换
可能出现并行程序性能不能最优化,甚至慢与串行程序 - 死锁
- 资源限制的挑战
受限与资源的限制,可能将并行程序最终按照了串行方式执行(例如,某一资源同时只允许一个线程访问)
线程:
程序中单独顺序的控制流,本身依靠程序进行运行
进程:
执行中的程序
线程状态
创建状态:new
就绪状态:调用了start()等待调度
运行状态:执行run()
阻塞状态:暂停执行,可能在等待IO
终止状态:线程销毁
线程的优先级
1 : MIN_PRIORITY
10: MAX_PRIORITY
5 : NORM_PRIORITY(默认)
通过setPriority()方法设置
实现方式
两种实现线程的方式
- 继承Thread类
- 实现Runnable接口
|
|
线程调度器来分别调用所有线程的run()方法
Thread 常用方法
new Thread() //创建
new Thread(String name)
new Thread(Runnable target)
new Thread(
Runnable target,
String name
)
void start() //启动线程
static void sleep(long millis) //线程休眠
static void sleep(
long millis,
int nanos
)
void join() //使其他线程等待当前线程终止
void join(long millis)
void join(
long millis,
int nanos
)
stativ void yield() //当前运行线程释放处理器资源
//获取线程引用
static Thread currentThread() //返回当前运行的线程引用
//是否启动
boolean isAlive() //是否启动
//优先级
void setPriority(int newPriority) //设置线程优先级
继承Thread和实现Runnable接口的区别
(1)适合多个相同程序代码的线程去处理同一资源的情况
把虚拟CPU(线程)同程序的代码,数据有效的分离,较好地体现了面向对象的设计思想。
(2)可以避免由于Java的单继承特性带来的局限。
我们经常碰到这样一种情况,即当我们要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么,这个类就只能采用实现Runnable接口的方式了。
(3)有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。
当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程操作相同的数据,与它们的代码无关。当共享访问相同的对象是,即它们共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。