多线程总结

xiaoxiao2021-02-28  94

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();

    }

}

转载请注明原文地址: https://www.6miu.com/read-39758.html

最新回复(0)