手记

Java线程知识点总结

  1. 进程与线程
    1,多个进程额内部数据和状态是完全独立的,而多个线程是共享一块内存空间和一组资源,有可能互相影响;
    2,每个进程都有一段专用的内存区域,而线程间可以共享相同的内存单元,(包括代码和数据)并利用这些共享单元来实现数据交换,实时通信与必要的同步操作。
  2. 主线程
    每个java程序都至少有一个线程,即主线程,当一个Java程序启动时,jvm会创建主线程,并在该线程中调用程序的main()方法。
    主线程的作用是:
    1,它是产生其他子线程的线程。
    2,通常它必须最后完成执行,因为它执行各种关闭动作。
    尽管主线程在程序启动时自动创建,但它可以由一个Thread对象控制。
    eg:调用Thread.currentThread()静态方法,返回调用该方法的当前线程的引用;
    Thread th1= Thread.currentThread();
    System.out.println("我是主线程:"+th1.getName());
  3. 创建线程的两种方法:
    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() {
     }
    }
  4. Java中线程的方法
    start()通过调用本线程的run()方法,使调用该方法的线程开始执行
    run() 当一个线程初始化之后,start()方法会自动的调用run()方法,在该方法内编写运行本线程时需要执行的代码,也是Runnable接口的唯一方法,一旦run()方法返回,本线程也就终止了。(一般不再线程中直接调用此方法)
    final void join() //等待该线程结束,调用了该方法的线程拥有高于其他线程的优先级
    static void yield() //把正在执行的线程临时暂停,其实就是使当前线程放弃cpu,进入就绪状态,重新排队,所以可以允许其他线程运行
    final boolean isAlive() //返回线程是否处于活动状态
  5. 线程状态(生命周期)
    创建状态 new Thread() 具备了线程的特征,系统却并未为其分配资源,可以在此时为线程设置名字,优先级等
    就绪状态 start() 获得了除cpu以外的所有资源
    运行状态 系统正在执行run()方法
    阻塞状态 eg:某个线程调用了sleep()方法
    死亡状态 线程在run()方法执行完毕以后,线程死亡;线程在调用了interrupt()或者sleep()方法后,也可能因为异常而死亡、
    结束线程的3中方法:
    1,线程正常结束
    2,使用stop()方法 (不推荐使用)
    3,使用interrupt()方法,中断正在执行的线程
  6. 线程优先级(并不能保证线程的执行顺序)
    默认-5 ;min-1; max-10
    相关方法: thread.setPriority ( int_value ); thread.getPriority ( );
  7. 线程组
  8. 多线程和线程同步
    加锁机制:每一时刻只能有一个线程对共享志愿进行读写操作,就像上了一把锁,只有拥有钥匙的线程才能访问。
    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();
  1. 线程通信(同步机制PV)
    wait()
    notify() notifyAll()
12人推荐
随时随地看视频
慕课网APP

热门评论

总结的很好很感谢这次的知识!嘻嘻

查看全部评论