线程浅析
1.进程与线程
一个进程包含多个线程。可以把进程当做一个应用程序。
操作系统分配一段时间给一个进程,让CPU执行该进程。进程再将时间片段分割给各个线程
2.创建线程(Thread)的方法
//方法一
Thread thread = new Thread(){
@Override
public void run() {
// TODO Auto-generated method stub
super.run(); //要写的代码
}
};//创建Thread类,重写run方法
thread.start() //开启线程
//方法二
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
NewThread nt = new NewThread();
Thread thread = new Thread(nt);//将该类放入Thread类中
thread.start();//启动线程
}
}
class NewThread implements Runnable{//创建一个继承Runnable接口的类
@Override
public void run() {
// TODO Auto-generated method stub
//要写的代码
}
}
注:所以说Thread类自身继承了Runnable();
3.线程的生命周期
图解
理解: 线程具有7种状态
出生:在Thread运用start()方法之前都算出生状态 就绪:当start()方法完成之后线程处于就绪状态(等待执行)
运行:操作系统分配时间,让线程进入cpu运行
产生阻塞的三种方法(也是三种状态):
等待:利用thread1.wait()线程自动进入阻塞状态。
一种设置时常:thread1.wait(1000);//当过了1000毫秒后自动处于就绪状态
另一种不设市场:只能够其他线程利用thread1.notify()唤醒,否则将一直处于阻塞状态。
睡眠:利用thread.sleep()进入睡眠状态。
必须设置时长,当时间过了自动进入就绪状态
阻塞:当线程处于等待I/O的输入输出方可再次运行时,处于阻塞状态。等到输入输出完毕时候自动进入就绪状态。
最后
线程运行完之后处于死亡状态
4.线程的优先级
优先级高的线程先运行,低的后运行。
thread.setPriority(int rank);//设置优先级
thread.yield()//让比自己高优先级的线程先运行
5.其他主要方法
//join()方法 Thread thread1 = new Thread(){
public void run (){
thread2.join(); //thread2调用了join方法
}
};
Thread thread2 = new Thread(){
public void run (){
//
}
}
//所以thread1要等待thread2执行完毕才能执行
6.线程同步
1.什么叫线程同步,为什么需要线程同步
当多个线程同时修改或调用同一个资源的时候,可能会导致数据不一致的情况,为了防止这种情况。就需要当一个线程使用资源的时候,另一个线程需要等待前一个线程使用完成。
2.线程锁
将资源对象锁住,防止其他线程使用。
//方法一
Thread thread = new Thread(){
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
synchronized(){
//锁住资源对象
}
}
}
//方法二
Thread thread = new Thread(){
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
use();
}
private synchronized void use(){
//锁住资源对象
}
}
//所以说synchronized是一个修饰符
7.小技巧
1.如何控制线程死亡:
boolean isDead = true;
Thread thread = new Thread(){
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while(isDead){
if (...){
//...
}
else{
isDead = false;
}
}
}
}