link方式(自定义方式):
为什么ConcurrentHashMap的读操作不需要加锁?
ArrayList集合为什么不能使用foreach增加、删除、修改元素
堆和栈的区别
java使用java.lang.Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。每个线程的作用是完成一定的任务,实际上是执行一段程序流即一段顺序执行的代码。java使用线程执行体来代表这段程序流。
java中通过继承Thread类来创建并启动多线程的步骤如下:
l 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体。
2 创建Thread子类的实例,即创建了线程对象
3 调用线程对象的star()方法来启动该线程
1 | 测试类 |
构造方法:
public Thread() :分配一一个新的线程对象。
public Thread(String name) :分配一个指定名字的新的线程对象。
public Thread(Runnable target) :分配一个带有指定目标新的线程对象。
public Thread(Runnable target, String name) :分配一个带有指定目标新的线程对象并指定名字。
常用方法:
public String getName() :获取当前线程名称。
public void start() :导致此线程开始执行; Java虚拟机调用此线程的run方法。
public void run() :此线程要执行的任务在此处定义代码。
public static void sleep(long millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。
public static Thread currentThread() :返回对当前正在执行的线程对象的引用。
创建线程的另一种方法是声明实现 Runnable接口的类,该类然后实现run方法。然后可以分配该类的实例,在创建Thread时作为一个参数来传递并启动。
实现Runnable接口
java.lang.Runnable
Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为run()的无参数方法。
1 | class PrimeRun implements Runnable{ |
1 | 1 创建一个Runnable接口的实现类 |
Thread和Runnable的区别
如果一个类继承Thread ,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。
总结:
实现Runnable接口比继承Thread类所具有的优势:
1.适合多个相同的程序代码的线程去共享同一个资源。
2.可以避免java中的单继承的局限性。
3.增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。
4.线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类。
扩充:在java中,每次程序运行至少启动2个线程。一个是main线程 ,一个是垃圾收集线程。因为每当使用
java命令执行个类的时候,实际上都会启动一个JVM ,每一个JVM其实在就是在操作系统中启动了一个进
程。
实现RunnabLe接口创建多线程程序的好处:
1.避免了单继承的局限性
一个类只能继承一个类(一个人只能有一个亲爹),类继承了Thread类就不能继承其他的类
实现了Runnable接口,还可以继承其他的类,实现其他的接口
2.增强了程序的扩展性,降低了程序的耦合性(解耦)
实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦)
实现类中,重写了run方法:用来设置线程任务
创建Thread类对象,调用start方法:用来开启新线程
匿名内部类方式实现线程的创建
匿名:没有名字
内部类:写在其他类内部的类
匿名内部类作用:简化代码
把子类继承父类,重写父类的方法,创建子类对象合-步完成
把实现类实现类接口,重写接口中的方法,创建实现类对象合成-步完成
匿名内部类的最终产物:子类实现类对象,而这个类没有名字
格式:
new
父类/接口(){
重复父类/接口中的方法
};
1 | public class InnerClassThread{ |
1 | //包子类 |
线程池
1 | /* |
Lambda表达式
面向对象的思想:
做一件事情,找一个能解决这个事情的对象,调用对象的方法,完成事情.
函数式编程思想:
只要能获取到结果,谁去做的,怎么做的都不重要,重视的是结果,不重视过程
- 本文作者: wenshuaiyang
- 本文链接: http://yoursite.com/2019/08/24/java-多线程/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!