热爱生活的猫
2016-03-22 19:31:21浏览 5629
- 进程与线程
1,多个进程额内部数据和状态是完全独立的,而多个线程是共享一块内存空间和一组资源,有可能互相影响;
2,每个进程都有一段专用的内存区域,而线程间可以共享相同的内存单元,(包括代码和数据)并利用这些共享单元来实现数据交换,实时通信与必要的同步操作。
- 主线程
每个java程序都至少有一个线程,即主线程,当一个Java程序启动时,jvm会创建主线程,并在该线程中调用程序的main()方法。
主线程的作用是:
1,它是产生其他子线程的线程。
2,通常它必须最后完成执行,因为它执行各种关闭动作。
尽管主线程在程序启动时自动创建,但它可以由一个Thread对象控制。
eg:调用Thread.currentThread()静态方法,返回调用该方法的当前线程的引用;
Thread th1= Thread.currentThread();
System.out.println("我是主线程:"+th1.getName());
- 创建线程的两种方法:
1,通过实现Runnable接口,重写其中的run()方法,再调用Thread类的构造方法Thread(Runnable,Threadname)来实现
2,通过创建Thread类的子类来实现,即继承Thread类,重写其中的run()方法
eg:创建一个线程,可以之定义线程名字
class HelloThread extends Thread{
String name;
public HelloThread(String name) {
super(name);
}
@Override
public void run() {
}
}
- Java中线程的方法
start()通过调用本线程的run()方法,使调用该方法的线程开始执行
run() 当一个线程初始化之后,start()方法会自动的调用run()方法,在该方法内编写运行本线程时需要执行的代码,也是Runnable接口的唯一方法,一旦run()方法返回,本线程也就终止了。(一般不再线程中直接调用此方法)
final void join() //等待该线程结束,调用了该方法的线程拥有高于其他线程的优先级
static void yield() //把正在执行的线程临时暂停,其实就是使当前线程放弃cpu,进入就绪状态,重新排队,所以可以允许其他线程运行
final boolean isAlive() //返回线程是否处于活动状态
- 线程状态(生命周期)
创建状态 new Thread() 具备了线程的特征,系统却并未为其分配资源,可以在此时为线程设置名字,优先级等
就绪状态 start() 获得了除cpu以外的所有资源
运行状态 系统正在执行run()方法
阻塞状态 eg:某个线程调用了sleep()方法
死亡状态 线程在run()方法执行完毕以后,线程死亡;线程在调用了interrupt()或者sleep()方法后,也可能因为异常而死亡、
结束线程的3中方法:
1,线程正常结束
2,使用stop()方法 (不推荐使用)
3,使用interrupt()方法,中断正在执行的线程
- 线程优先级(并不能保证线程的执行顺序)
默认-5 ;min-1; max-10
相关方法: thread.setPriority ( int_value ); thread.getPriority ( );
- 线程组
- 多线程和线程同步
加锁机制:每一时刻只能有一个线程对共享志愿进行读写操作,就像上了一把锁,只有拥有钥匙的线程才能访问。
java通过synchronized实现线程的同步,加锁的方法有两种:
1,锁定冲突的对象(一个对象只有一个锁)
2,锁定冲突的方法
即当一个对象或者方法使用synchronized修饰,这个对象便被锁定。它访问结束时,让高优先级并处于就绪状态的线程,继续访问被锁定的对象,从而实现资源同步。当一个线程调用同步方法的时候,该线程就获得了当前对象的锁。
关于死锁:最好不要在一个同步块中嵌套另一个同步块。
eg:两个线程共享数据
class Demo{
private int sum=5; //被共享的数据
public void sub(){
synchronized (this) {
while(true){
if(sum<1)
break;
System.out.println(sum--);
}
}//
}
}
//线程类
class MyThread extends Thread{
Demo d1;
public MyThread(String name, Demo d1) {
super(name);
this.d1=d1;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
d1.sub();
}
}
主方法代码:
Demo d1=new Demo();
MyThread th1=new MyThread("线程1", d1);
MyThread th2=new MyThread("线程2", d1);
th1.start();
th2.start();
- 线程通信(同步机制PV)
wait()
notify() notifyAll()
热门评论
总结的很好很感谢这次的知识!嘻嘻