关于JAVA多线程实现以及使用的讲解

java多线程是我们平时开发工作中经常用到的技术,也是面试或者笔试过程中高频技术点:

下面楼主就关于Java中我们常用到的多线程的技术简单的说说,文章中有什么错误或者问题的欢迎各位小伙伴指出并且留言,楼主会认真学习并且改正的哦,大家好才是真的好······

要了解多线程,首先我们需要知道java是如何实现多线程的呢?

  由于线程是依赖于进程而存在的,所以我们应该先去创建一个进程,而进程是由系统创建的,所以我们应该去调用系统功能去创建进程,但是java是不能直接调用系统功能的,所以我们没有办法去创建进程。但是java可以去调用C/C++写好的程序来实现多线程,然后由C/C++去调用系统功能创建进程,然后由java去调用类,然后提供一些类供我们使用,我们就可以来实现多线程。


java中的多线程在java官网提供的api中说java中实现多线程的方法有两种(没有或者需要java1.8-api的小伙伴们可以访问后面的地址进行下载哦:https://download.csdn.net/download/qq_37840993/10519013),但是多线程的实现实际上有三种,第三种不常用而已,但今天我们就先说说java官网中提供的两种方式:

1、一个是将一个类声明为Thread的子类。 这个子类应该重写run类的方法Thread 。 然后可以分配并启动子类的实例。 例如,计算大于规定值的素数的线程可以写成如下:

  •      class PrimeThread extends Thread {
             long minPrime;
             PrimeThread(long minPrime) {
                 this.minPrime = minPrime;
             }
    
             public void run() {
                 // compute primes larger than minPrime
                  . . .
             }
         }
  • 然后,以下代码将创建一个线程并启动它运行:

     PrimeThread p = new PrimeThread(143);
     p.start();
  • 另一种方法来创建一个线程是声明实现类Runnable接口。 那个类然后实现了run方法。 然后可以分配类的实例,在创建Thread时作为参数传递,并启动。 这种其他风格的同一个例子如下所示:


         class PrimeRun implements Runnable {
             long minPrime;
             PrimeRun(long minPrime) {
                 this.minPrime = minPrime;
             }
    
             public void run() {
                 // compute primes larger than minPrime
                  . . .
             }
         }
     

    然后,以下代码将创建一个线程并启动它运行:

         PrimeRun p = new PrimeRun(143);
         new Thread(p).start();
    
  • 每个线程都有一个用于识别目的的名称。 多个线程可能具有相同的名称。 如果在创建线程时未指定名称,则会为其生成一个新名称。

    除非另有说明,否则将null参数传递给null中的构造函数或方法将导致抛出NullPointerException 。(具体可参照java-api)Thread一章。

以上就是java官网对多线程的两种实现方式的讲述,

下面有几个问题:

1、run()和strat()有什么区别呢?(面试题)

run():它仅仅是封装被线程执行的代码,直接调用时是普通方法;

strat():它首先是启动的线程,然后再由JVM去调用该线程的run()方法。

2、线程中常用的方法有哪些?

休眠线程方法;  加入线程;启动线程;礼让线程;守护线程;中断线程;等待等等;具体的方法名楼主在这里就不多说了,因为楼主也需要温习温习哦。。。。。java-api上面有详细的方法说明哦。

3、线程的生命周期?

新建:创建线程对象

就绪:有执行资格,但没有执行权

运行:有执行资格,有执行权

                阻塞:由于一些操作让线程处于了改状态,没有执行资格,没有执行权,而另一些操作却可以把它激活,激活后处于就绪状态。

死亡:线程对象变成垃圾,等待被回收



4、为什么要重写run()?启动线程对象用的那个方法?有了方式1,为什么还来一个方式了?

1)、run()里面封装的是被线程执行的代码

2)、strat()

3)、可以避免由于java单继承带来的局限性。

4)、适合多个相同的程序代码去处理同一个资源的情况,把线程同程序的代码,数据有效分离,较好的体现了面向对象的设计思想。

猜你喜欢

转载自blog.csdn.net/qq_37840993/article/details/80922013