如何深入Java多线程开发?
谢谢邀请
java多线程的开发属于java编程里面高级层面应用,实际中应用的场景非常多,举个简单的例子,同时下载多个文件,同时接收多条数据,多个操作同时操作一个数据块等等这方面涉及到的非常多,在开发app或者企业级应用方面都会涉及到。
简单的来说多线程编程几乎是所有编程语言里面比较难的部分了,java经常提到的线程池核心也是这部分,其实多线程就是并发问题,为了提升效率,正常的多个事情可以事先排好队列一个个的来也可以把事情做的很好,但是如果每个人都能去找前台解决问题是不是更好,所以多线程的概念就出来了,在这当初算是软件行业一个革命性的突破,现在几乎所有的编程语言都具备这种属性。多个人一起做事情,但如果共同操作一个数据块岂不是要打架,于是临界区的概念以及线程锁也就出来了。保证在操作同一个数据区域的时候遵守一个规则,一个数据在一个时间段内只能有一个人来操作。
现在推荐几本多线程和并发编程书籍
java并发编程实战
java多线程编程核心技术
基本上两本书看完对于多线程的以及并发性有一个大概的了解,然后自己写个多线程操作的例子,可以写个同时下载多个文件的例子。
多线程在网络编程里面涉及到的非常多,这块骨头啃不下就不要说对java已经很熟悉了。
第一步,建议先学好操作系统这门课,深入理解进程和线程,理解线程的状态转换和调度;
第二步,学习Java中线程的操作,Java对象的多线程特性,练习使用Java代码操作线程和调度线程,线程池等高级操作;
第三步,学习并理解高手的多线程代码。
对于新手来说多线程无疑最难理解的部分,平常我们练习最多的就是输出一些参数,从db中增删改查操作一些数据,这些都是单线程所做的事情,如果遇到了大数据量的处理,IO密集型的任务以及高并发的处理,这时就得用到多线程。
常用的实现方式就是继承thread,或者实现Runnable接口,还有一种带有返回值的方式,即实现callable接口来实现多线程的处理。当然线程频繁的启动和关闭是很耗资源的,于是就使用到了线程池。可以先学会使用java自带的四种线程池,然后理解线程池的原理,比如corePoolSize核心线程数,maxPoolSize最大线程数,线程拒绝策略等。
单核cpu同时只能运行一个线程,在java中的线程是随机执行的,内存中会有程序计数器记录线程执行到了哪里,由于线程的切换时间很短,肉眼看起来好像同时执行多个线程。所以单核cpu只能实现并发,而多核cpu才能使用多线程实现并行,充分利用cpu资源。
接下来多线程肯定会了解到线程安全的问题,实现线程安全的几种方式,比如synchronized,lock,volatile,final关键字,Atomic类,countdownlatch,concurrent包下的类,CAS的实现原理,TLAB(thread local buffer allocation),线程优先级运行状态,同步异步,以及由于锁竞争导致的死锁,守护线程的作用等。
欢迎大家留言讨论
求各位大神,Java多线程看哪本书好?
《Java并发编程实战》
作者:盖茨(Brian Goetz)
出版社:机械工业出版社
本书深入浅出地介绍了Java线程和并发,是一本的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的任务,如何提高单线程子系统的响应性,如何确保并发程序执行预期任务,如何提高并发代码的性能和可伸缩性等内容,很后介绍了一些不错主题,如显式锁、原子变量、非阻塞算法以及如何开发自定义的同步工具类。
书不在多,一本就行!本书是Java进阶的必看书目之一,作者Brian Goetz有20多年的软件咨询行业经验,并著有至少75篇关于Java开发的文章。个人感觉本书读起来章节安排得还行,理论由浅入深,涉及的案例也比较典型。相信仔细研读可以带来不小的收获~希望能帮助到题主。
推荐java并发编程实战这本书。
这本书从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则。
如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的任务,如何提高单线程子系统的响应性,如何确保并发程序执行预期任务,如何提高并发代码的性能和可伸缩性等内容。
最后介绍了一些高级主题,如显式锁、原子变量、非阻塞算法以及如何开发自定义的同步工具类。
总之,书中介绍的比较全,原理解析比较透彻。希望我的回答能帮到你。
一个五年经验的java工作经验深刻推荐
第一本,java并发编程实践,这本书不仅解释了它们如何工作,如何使用,还阐释了创造它们的原因和背后的设计模式
第二本,深入理解java虚拟机,JVM高级特性和最佳实践 ,这本书围绕内存管理,执行子系统程序编译和优化,高效并发等核心对jvm进行了全面深入的分析
希望对您有用,一起加油!
有本书叫《Java线程》,O'Reilly出版社的。
O'Reilly出的书口碑好像还不错,其java系列的书有好多都是很具体,好像还有像一本只讲JMS的,反正就是类似的书。想看某个分支具体讲解的书去O'Reilly翻翻。
如何创建并运行java线程?
在java语言中,线程的类名是Thread,有两种方式创建线程:直接创建Thread对象或者创建线程池,由线程池来管理线程。
直接创建Thread对象
我们可以直接用默认构造函数创建一个线程
Thread thread = new Thread();
然后调用它的start方法来启动线程:
thread.start();
此时线程并不会执行业务代码,很快就会执行完毕。
要想让线程运行目标代码,有多种方式:
1、将目标代码编写在一个实现了Runnable接口的类的run方法中,创建线程时,用这个类的实例作为构造函数参数;
或者直接创建一个Runnable接口的匿名子类,用这个
2、创建一个Thread类的子类,在子类重写run方法,在run方法中实现业务:
然后再创建一个Thread子类实例,并调用start方法执行业务代码
或者创建一个Thread的匿名子类:
使用线程池
Executors类提供了四类创建线程池的静态方法,它们都会返回ExecutorService接口的实例,这些实例就是线程池,只需要调用它的submit方法,将要执行的任务提交给线程池,线程池就会按照自己的策略来执行任务。而这个任务,就是实现了Runnable接口的对象。
以上就是java中创建线程和执行线程的方法,希望可以帮助到题主,欢迎大家批评指正。
如果喜欢我的回答,请点赞,关注,谢谢!
java里面创建线程有四种方式,这四种方式可以通过是否有返回值进行区分:
无返回
1. 创建任务,实现Runnable接口,重写run();
2. 继承Thread类,重写run();
有返回
1. 实现Callable接口,重写call(),利用FutureTask包装Callable,并作为task传入Thread构造函数;
2. 使用线程池。
首先我们来看下线程之间的状态,及他们之间的相互转换:
实现Runnable接口
因为Java只支持单继承,继承了Thread类就不能再继承别的类了,所以实现继承更推荐让线程类实现Runnable接口。将Runnbale作为参数传入Thread的构造函数,创建Thread。
继承Thread类,重写run()
创建线程只需要继承Thread类,然后在run()方法里写下线程要实现的任务即可;通过调用start方法来启动线程,但不能直接调用run()方法。
① Thread类本质上是实现了Runnable接口,代表一个线程的实例。
② Runnable接口只有一个抽象的run()方法。
③ 启动线程的唯一方法就是通过Thread类的start()方法。
④ start()方法是一个native方法,它将启动一个新的线程,并执行run()方法。
⑤ 自定义类直接继承Thread,并重写run()方法,就可以启动新线程并执行自己定义的run()方法。
利用Callable接口创建并启动
① 定义MyClass实现Callable接口;
② 重写call(),将执行的代码逻辑植入;
③ 创建FutureTask的对象;FutureTask中定义了run(),run()内部调用了call(),并保存了call()的返回值;
FutureTask futuretask = new FutureTask(newMyClass());
④ 创建Thread的对象;
Thread thread = new Thread(futuretask);//传入参数Runnable接口
⑤ 启动线程;thread.start();
⑥ 可通过FutureTask类的get()方法获得线程执行结束后的返回值,即call的返回值。futuretask.get();
通过线程池来创建线程
① new ThreadPoolExecutor(…);
② 创建任务Task implements Callable,重写run()方法;
③ 通过线程池的execute()或submit()将任务command传入线程池;
④ 获取返回值。
示例代码如下:
总结
线程的创建有四种方式:主要分为有返回和无返回,具体根据使用场景来选择。
① 如果不需要返回且线程数量小,则建议采用实现Runnable接口,重写run()的方式;
② 如果需要返回且线程数量小,则建议采用实现Callable接口,重写call(),利用FutureTask包装成一个Runnable,再作为参数传入Thread的构造方法的方式创建线程;
③ 如果线程数量较多,则建议采用线程池方式创建:execute提交任务实现无返回操作,submit提交任务实现有返回操作。
欢迎关注笔者,持续分享有价值的优质架构文章。

