4月份的总结2

{:toc}

java多线程和线程池

多线程

1:java天生就是多线程的

java的main方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,实际上java程序天生就是个多线程程序,因为执行的方法是一个名称为main的线程。

1
2
3
4
5
6
//通过这个代码可以获取到当前的线程数量
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
for (ThreadInfo threadInfo : threadInfos) {
System.out.println(threadInfo.getThreadName());
}

Monitor Ctrl-Break //监控 Ctrl-Break
Signal Dispatcher //分发处理发送给jvm信号的线程
Finalizer // 调用对象finalize
Reference Handler //清除 reference的线程
main // 用户入口线程

2:线程的启动与中止

启动的方式 Thread , Runnable和callable

start()

Suspend(), resume()和stop(), 但是这些api是过期的,线程调用suspend(),调用后,线程不会释放已经占用的资源(比如锁),如果不保证线程正常释放,可能没有给予线程释放工作的机会,因此会导致程序可能工作在不确定的状态下。

Thread.interrupted()和Thread.currentThread().isInterrupted()的区别

Thread.currentThread().isInterrupted():是一个很正常的方法,就是判断线程的状态,不会做出什么改变

Thread.interrupted()会将状态重置,如果是 false的情况下,就不会重置状态,因为就是调用后,让这个线程。感觉线程重新获取了生命,所以后面调用Thread.interrupted(),不会将状态重置了,除非重新调取 Thread.currentThread().interrupt():

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void main(String[] args) {
Thread thread = new Thread();
thread.start();
Thread.currentThread().interrupt(); //如果这行代码没有写,第一次也是false

System.out.println("第一次返回的值" + Thread.interrupted());
System.out.println("第二次返回的值" + Thread.interrupted());
System.out.println("第三次返回的值" + Thread.interrupted());
System.out.println("第四次返回的值" + Thread.interrupted());
System.out.println("第五次返回的值" + Thread.interrupted());
}
结果:
第一次返回的值true
第二次返回的值false
第三次返回的值false
第四次返回的值false
第五次返回的值false

这就充分解释了,interrupt是协作式的,不是强制式,这样就比较安全,可以正常释放线程的一些资源

3: 处于死锁状态的线程无法通过interrupt中断

草稿:

写一个基于线程池的例子,就是下载文件。可以自己进行网络请求封装,等等一些操作。可以网络查找一下