第一种通过继承重写run方法实现

第二种,通过Runnable接口实现

这里之所以可以传入一个接口是因为Thread中有这个构造方法

第三种,使用匿名内部类实现

第四种,使用匿名内部类加上runnable接口实现

第五种,使用lambda表达式(推荐)

Thread常见的构造方法

给某个线程起名字

通过JDK自带的Jconsole去查看线程的情况,如果这个时候我们并没有给线程起名字,那么他就会默认使用Thread-0/1/2开始

在线程中其他比较重要的属性

前台线程和后台线程(守护线程)的区别

是否为后台线程(守护线程)

举个例子:陈浩南和乌鸦哥要谈合作,这个时候吃了个饭,只有浩南和乌鸦可以决定这个饭局有没有必要继续,他们说结束那就是结束,还没结束就要继续,这个时候,他们两个就叫做前台线程,因为他们关系这个饭局可不可以继续进行,也就是这个进程会不会继续运行,而其他的小弟只有站着的份,没有任何话语权,只能听乌鸦和浩南的调遣,两个老大说结束那就结束,他们就叫做后台线程

通过这段代码我们可以看出来,我把thread线程设置为了后台线程,这个时候主线程就是main他只能循环三次,之后截止了,作为后台线程的thread就好像无能的丈夫,无力阻止,主线程说关就关,你就是没有办法。

查看线程是否存活

可能会出现三个或者四个true因为在这里他们是并发执行(调度的情况你无法掌控)

线程的启动是日抛的,一个线程只能启动一次,要启动多次就要创建多个线程

???为什么在程序报错之后还能跑???

这个是因为main和t线程都是前台线程,只要其中的任何一个不停下,那jvm就不会管你,我一开始start了t线程,因为线程的状态是不可逆的,所以第二次启动的时候是无限的这个时候后面还有一个main线程,这个时候无法运行了,所以就抛出异常但是还是继续执行,如果不想这样就把前面的t线程设置为守护线程/后台线程

如何中断一个线程

在这个过程中执行顺序是:先new Thread对象,然后执行lambda表达式,在这个过程中t还是属于未定义的,所以这个时候是没办法使用t.interrupted,在thread的库中,人家早就想好了方法了Thread.currentThread().isInterrupted()作用类似于this谁调用就是谁

为什么还是报错了,是因为我们捕获了这个异常,interrupted强行唤醒了sleep这个阻塞的方法,要使他不报错只需要在catch那改成break就行了

变量捕获

在JAVA中因为lambda表达式是回调函数,他的执行是很慢的,在系统创建出线程之后这个lambda才开始执行,当main方法执行完了,isfinished都被销毁了,lambda可能都还没找到,为了解决这种问题,在java中使用的方法是拷贝一份lambda无论外面是否销毁都不影响,但是同时,因为你是拷贝的如果外面修改或者是里面修改就会导致数据不一致的问题,所以在java中是不允许这样做的,所以就产生了叫做变量捕获的东西,意思就是在lambda中只能是常量或者不可变的变量。

  1. 等待某个线程结束

使用关键字join,谁调用就是等谁结束,在这里中,“等待thread线程结束”永远都不会被打印,因为他要等thread线程结束才可以执行,这个过程就叫“线程阻塞”,举个例子:对你没感觉的人无论你等多久人家都不会理你。

改进方法

在jion中添加等待时间,在这段代码中在jion里面设置1000毫秒,如果1000毫秒之后t线程还么执行完毕,那就不管了,走自己的路去。举个例子:就好像等一点时间,等不到就别等了,别人都显怀了你还没释怀?

Sleep线程

Sleep(1000),不一定是真的休眠了1000毫秒,可能是比他更少的,休眠的意义就在于让出cpu先让其他的东西先跑等时间到了再去跑

特殊写法:sleep(0),这种看着没啥用,实际上主要是为了让出cpu的空间让其他的东西先跑,就比如某个线程实在是太大了,就可以使用这种写法

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐