下面总结一下这段时间学习java线程的一些入门基础知识.
一.什么是线程?
这个问题可以说是每个刚涉及java线程的人都会想知道的问题.究竟什么是线程呢?有的书上说线程就是执行代码的主体;有的书上说线程就是有序地执行代码的控制流程.其实具体点说一个线程就好比是一个人,他的工作任务已经被安排好,他只需要按顺序把任务全部完成,那么他就可以下班回家了!
二.线程有什么特性?
线程最大的特点就是它是独立运行的,不会受到其它线程的干扰.
三.什么是并发,什么是并行?
并发:多个线程同时运行在单核的CPU上时,因为CPU一个时间段只能运行一个线程,但由于CPU分配的时间片很短,因此,在我们看来,多个线程在CPU中是同时运作的,这就是并发.
并行:多个线程同时运行在多核CPU上,在同一个时间段就有可能有多个线程同时运行.
四.创建线程的方法
线程的创建可以有2种方法,一种是继承Thread类,一种是实现Runnable接口.这两种方法究竟有什么不同呢?通过继承Thread类来创建线程时,用户需要覆盖Tread中的run方法,然后new Thread()创建一个线程实例;但通过实现Runnable接口的方法只需实现run方法,并且在创建线程时是将Runnable的实例作为参数传入Tread的构造方法中即可.
五.start()与run()的区别
创建完一个线程实例后,需要调用其start()方法来启动该线程实例,如果不调用start()方法,即使创建出一个线程实例,它也只是相当于一个简单的实例,没有任何意义!当调用了start()方法,启动了线程后,线程进入了可运行状态,那么下一步线程就会调用其run()方法,然后线程执行相应的任务.
假如在没有调用start()方法的情况下,直接调用run()方法.那么会发生什么事情呢?在没有调用start()方法的情况下直接调用run()方法,就相当于线程实例都没有被启动,那么线程实例只是相当于一个普通的实例,当它调用run()方法时,也只是个普通的方法调用,根本没有任何意义.
六.sleep(),wait(),join()区别
在当前实例中调用sleep()方法,会使当前线程进入睡眠状态,一般调用slee()方法时都会传入一个毫秒数作为当前线程睡眠的时间,线程睡眠相应的毫秒后便会重新苏醒,当前线程处于睡眠状态时是不会释放当前对象锁的,其他线程无法获得当前对象的锁,只能等待,这是便会出现线程堵塞的现象.
wait()方法与sleep()方法的作用其实是一样的,但它们也有不同的地方;wait()方法使当前线程进入等待状态,进入等待状态的线程会释放当前获得的对象锁,以供后续的线程使用.
join()方法是等待指定的线程运行结束.当调用join()时,当前线程会等待它所连接的线程不再处于活动状态(既线程运行结束).
七.interrupted()与isInterrupted()区别
这两个方法都是用来判断线程是否被中断,它们的区别就在于:
interrupted()方法是一个静态方法,它是用来判断当前线程是否中断,然后返回一个布尔值;
isInterrupted()方法必须在一个对象上执行,判断所指定的对象是否已经被中断.