多线程总结

来源:互联网 发布:丫头蟋蟀罐淘宝店铺 编辑:程序博客网 时间:2024/06/05 07:08

1.Java中Runnable和Thread的区别

Thread一个类只能继承一个父类,这是此方法的局限。


2.为啥非要使用start();方法启动多线程呢?

可以实现交互式运行,可以调用操作系统的底层函数!


(底层函数:比你编程的层次更靠近硬件的函数都算“底层”函数

(层次是什么:

(1)加载父类(以下序号相同,表明初始化是按代码从上到下的顺序来的)
  1.为父类的静态属性分配空间并赋于初值
  1.执行父类静态初始化块;
(2)加载子类
  2.为子类的静态属性分配空间并赋于初值
  2.执行子类的静态的内容;
(3)加载父类构造器
  3.初始化父类的非静态属性并赋于初值
  3.执行父类的非静态代码块;
  4.执行父类的构造方法;
(4)加载子类构造器
  5.初始化子类的非静态属性并赋于初值
  5.执行子类的非静态代码块;
  6.执行子类的构造方法.
总之一句话,静态代码块内容先执行(父先后子),接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

3.为什么要用线程呢在什么时候用到!

想理解多线程你就得 搞清楚什么是并发 什么是并行 ,概念:在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent)。而在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel)。我也有段时间纠结于这里,无论如何我必须得给你明确一点:在某一个时间点,一个CPU(单)只会运行某一个进程里的单个线程,所以我们经常称之为并发,说道同步机制,其实多线程并未真正实现微观意义上的同步,进程是一个运行单元,线程则是更小的运行单元,简而言之,就是进程细分成多个线程,譬如:一个进程A运行需要1s,它就会切换到进程B,但是实现多线程机制后,进程A细化成10个线程,每个线程只需运行0.1s,当然B线程也一样,这就出现,线程之间的切换时间更短,从宏观上看就出现同步幻象了。所以学习多线程你得真正理解所谓的同步并发,并不是真正的“同步”。当你理解这些的时候,你就初略的感觉什么时候该使用多线程机制,其实你的电脑每个程序都至少有一个主线程,那个管理器中的每一个进程,其实内部包含若干线程,每个时间点都是某个程序进程中的某个线程在运行
4.线程的常用方法


(api: java.lang---Thread)
1.start()
2.run()
3.sleep(intmillsecond
4.isAlive()
5.currentThread()
6.interrupt()
5.线程同步
Synchronized
系统内部实现锁机制,每个对象都有一把锁,同时只有一个线程获得这个对象锁,如果其他线程需要锁必须等待别
人释放后才能运行
同步方式

同步方法

同步块

6.为什么需要同步?

两个线程:

   accountantcashier,他俩共同拥有一个帐本。他俩都可以使用saveOrTakeint number)对帐本进

行访问,会计使用saveOrTake方法时,向帐本上写入存钱记录;出纳使用saveOrTake方法时,向帐本写入

取钱记录。因此,当会计正在使用saveOrTake方法时,出纳被禁止使用,反之也是这样。


线程的生命周期

1.线程的4种状态


   在Java语言中,Thread类及其子类创建的对象称作线程,新建的线程在它的一个完


整的生命周期中通常要经历4种状态:新建,运行,中断,死亡


线程的状态


class MyThread extends Thread{

    int number=0;

    boolean stop=false;

    booleangetStop(){

           return stop;

    }

    public void run(){

        while(true){

           number++;

          System.out.println(Thread.currentThread().getName()+"的number="+number);

           if(number==3){

              try{ System.out.println(Thread.currentThread().getName()+"被挂起");

                   stop=true;

                  hangUP();//挂起线程

                  System.out.println(Thread.currentThread().getName()+"恢复执行");

              }

              catch(Exception e){} 

           }

           try{Thread.sleep(1000);

           }

           catch(Exception e){}

        }

    }

    public synchronized void hangUP() throwsInterruptedException{

         wait(); 

    }

    public synchronized void  restart(){

        notifyAll();

    }

}



1 0
原创粉丝点击