java线程学习知识点

一:线程和进程的区别
       1,线程是共享变量的,而进程是有私有的变量
       2,创建线程和创建进程都需要消耗系统资源,但是创建线程的开销会更小
二,创建线程的两种方式
      1,实现Runnable接口,再用这个类创建Thread对象
             Class MyRunnable implements Runnable{
              //实现run方法
              public void run{
               }
             }
             Class …..
             {
               …….
               Thread thread =new Thread(MyRunnable);
               Thread.start();//
             }
        2,继承Thread 重写run()方法
           Class MyThread extends Thread{
public void run(){
}
          }
注意:在此不能直接调用run方法,如果调用run方法,则还是在原来的线程里执行方法。而Thread.start()方法可以创建一个新的线程
三:中断线程
1, 三种情况下,线程会被结束
(1)执行到return 方法;
(2)执行完所有语句;
(3)遇到错误,抛出异常
2,还有一种强行结束线程的方法 interrupt();
四:线程的状态
(1)new 创建线程后,调用start()方法前
(2)Runnable 调用start()方法之后,此状态下只能说该线程是可以运行的,它随时可能被系统切断,也随时被系统激活;
(3)Blocking
(4)Waiting 这两种线程的区别是blocking状态下随时会被系统激活,而wait状态只有被显式通知之后才可以进入runnable状态。
(5) Timed waiting
(6)Terminated
五:线程的优先级
线程的优先级与系统环境有关,比如windows系统接口提供7中不同的优先级水平
六:守护线程
守护线程should never 访问持久化的资源例如数据库或者文件,因为它有可能会在任何时间结束。
七:未捕获异常的处理
八:线程同步机制Synchronization
1,线程不安全的原因
cpu对内存中的某一个变量进行运算时,经历三个过程:
a,将内存中的制定变量加载load到寄存器register中
b,完成指定的运算
c,将运算的值推回到内存中
当一个线程完成ab两个步骤时可能会被调度器中断操作,此时变量被加载到寄存器中,例如内存中B=24;加载到寄存器中完成加一运算,变成25,但在推回内存前线程 被中断;接着另一个线程调用这个变量进行运算,此时加载到内存时是24,完成运算加5后推回内存,此时是29,可能第一个线程此时被唤醒,把25又推回内存中。错误就这样产生了。
2,线程同步所要做的事情就是,在完成对一个变量运算修改完成之前,不允许其他线程来访问这个变量,对象,或文件。
3,线程安全的实现方法:
a,Lock Object
Lock 是一个抽象类,实例化时需要用ReentrantLock去创建。
用法:private Lock lock=new ReentrantLock();
public void .......{
......
lock.lock();
try{
task;
}
finally{
lock.unlock(); //一定要在这个线程对变量或文件访问完之后把lock去了,否则其他线程不能访问
}
b,Condition Object
Condition需要从Lock中获得,即Condition condition=lock.newCondition();
Condition 中主要用的方法有:
await();
signalAll();
signal();
这个对象的主要作用是:当一个线程得到lock后,访问内存中的变量,但是发现某些条件不满足那么就放弃这个lock,让其他的线程有执行的机会。
Class Bank{
Lock lock=new ReentrantLock();
Condition condition=lock.newCondition();
public void transger(){
lock.lock();
while(true or false)
condition.await();
task;
condition.signalAll();
}
}
c,Synchronized关键字
用此关键字修饰方法表示此方法是线程安全的,例如:
public Synchronized getName(){
statements;
}
等同于
public void method(){
this.intrinsicLock.lock();
try{
methodbody;
}finally{
this.intrinsLock.unlock();
}
d,同步块Synchronized
例如:Class Bank {
private accounts;
public Object lock=new Object();
public void transfer(){
Synchronized(lock){
blocks;
}
}
}
e.不稳定的变量和final变量
九:高级应用
1,线程池

猜你喜欢

转载自blog.csdn.net/hfutzhouyonghang/article/details/52959279