在实际开发过程中遇到的多线程情况不多,但是在生产环境中多线程是最基本的情况,java面试时也会考到,所以看看多线程的知识还是很有必要的。
Thread,Runnable,Callable,Future,FutureTask,Executors这是java常见的接口和类。
thread.run():线程具体要执行的代码,thread.join():等待该线程完成。
---------------------8/25
写过一些程序后,在来看多线程。其实多线程涉及到内存读写,cpu等底层的东西,java语言也尽量帮我们封装和抽象,使其对于程序员能够简单些。其中java中有synchronized和volatile关键字,以及后面的Excutor框架。
synchronized:给对象(或者代码块)加锁,使一个线程在访问时,其他线程等待,实现机制:jvm内置的锁
volatile:在多线程中保证线程的可见性,具体机制主要是保证内存和缓存中的数据的一致性。
问题:
1.多个用户访问同一段代码算多线程吗? 答:不一定
2.通常说的并发是不是针对多线程的?答:是
3.那怎么样控制并发?答:锁
java的并发操作中,主要在java.util.concurrent包中。
比如常见的ScheduledExecutorService,简单来说,这是一个执行定时任务的线程,可以参考这篇博文:https://blog.csdn.net/wangmx1993328/article/details/80840598,这个类适合于在分布式系统中定时发送心跳的操作。同时还有个简单的Timer和TimerTask类:https://blog.csdn.net/wangmx1993328/article/details/80785614,都是非常好的阅读材料。其用法简单一句话总结:timer.schedule(timeTask,0,60\*1000)。
其中ConcurrentLinkedQueue的源码解读,这篇博文写的非常不错
-----------------8/13
数据库连接池就使用了多线程的技术,数据库连接池基本是标配了,如c3p0,dbcp等,这已经成为比较成熟的技术,我之前也用过c3p0,现在有些忘了,我需要理解一下。应该看一下源码,能看懂一点是一点。
new ComboPooledDataSource();//空参,自动到classpath目录下面加载“c3p0-config.xml”配置文件---配置文件的存储位置和名称必须是这样,且使用“默认配置”
//ComboPooledDataSource pool = new ComboPooledDataSource("demo");//加载“c3p0-config.xml”文件中定义的“demo”这个配置元素
-------8/23-------
我发现我对java多线程的认识还存在很大的误区。比如多线程的停止和程序的停止,调用一个函数,虽然看起来没有开启一个线程,其实很可能已经开启了。
开发框架比如Netty,大量使用异步回调ChannelFuture,自己实现异步回调比较苦难,但是JDK8提供了异步调用的类CompletableFuture,非常友好。
参考资料:《java并发编程的艺术》