java线程学习(一)

要开始养成写博客的习惯啦,第一篇博客,就写写自己关于线程的学习吧!

java多线程最基本的实现方式有继承Thread类,实现Runnable接口以及实现Callable接口:

1、继承Thread类  然后重写run方法,将逻辑代码写在run()方法中


使用该线程时只需要new出一个该线程的对象,然后调用start()方法即可(切记不可直接调用run()方法)


2、实现Runnable接口 然后重写run方法,将逻辑代码写在run()方法中


实现Runnable接口的线程使用方式与继承Thread类不同,从下图 我们可以看到


那么关于两种方式 有何区别呢???查看源码我们可以发现


Thread类实现了Runnable接口,并且Runnable接口只有run()方法


无论我们继承Thread类还是实现Runnable接口,当我们new出一个线程并调用线程的start()方法,都会将线程加入thread类中的group中



然后由虚拟机决定调用group中哪个线程的run方法


从上面的分析我们可以看出,两种实现线程的方式最终的效果时一样的,那么到底用哪种方式呢?

emmmmmm  我觉得考虑到java的单继承多实现,当然是实现接口好一点啦!

3、现在我们来看一看Callable接口的方式


从接口定义可以看到Callable接口similar to Runnable接口的,但是更重要的一点 可以返回result 和throw异常

下面我们来实现Callable接口看一看


执行Callable方式,需要FutureTask实现类的支持,用于接收运算结果


学习完了最基本的线程实现方式,现在来看看Thread类中常见的几个方法,包括:join()、sleep()、yield()、interrupt()、setpriority()

1、join()

    join()的作用为wait for this thread to die 即 等待调用该方法的线程死亡(当子线程调用了join方法之后,主线程需要等待子线程执行完毕,才会执行)

    join()有三个重载

    

最终join()和join(long,int)都是调用的join(long),现在来查看join(long)的源码


我们可以看到 该方法会不断检查当前线程是否alive


当millis==0时  主线程会一直等待 直到子线程死亡

当millis>0时 主线程最多等待millis毫秒,随后就会参与竞争cpu资源

2、sleep()


该方法是static修饰的,让当前线程进入sleep状态,让出cpu资源。但不会丢失监控器的所有权,当sleep 到millis毫秒 就会加入资源竞争。这里还要提一下属于object类的wait()方法,该方法会让调用的线程让出cpu资源并进入等待池,直到被notify()或者notifyAll()唤醒 ,稍后会进行详解。

3、yield()

通过Thread.yeild()可以是当前线程从运行状态转为就绪状态,很少使用

4、interrupt()

    将线程的中断标志位设置为true,中断操作则由线程自己执行

当对一个线程,调用 interrupt() 时:
    如果线程处于被阻塞状态(例如处于sleep, wait, join 等状态),那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常。
        如果线程处于alive状态,那么会将该线程的中断标志设置为 true。被设置中断标志的线程将继续正常运行,不受影响。
如果想要停止线程需要自己在run方法中对interrupted进行校验并终止

5、setpriority()

设置线程优先级  参数越大  优先级别越高






猜你喜欢

转载自blog.csdn.net/qq_28881611/article/details/80073362