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