thread


为什么使用多线程

​ 更多的处理器核心 更快的响应时间 更好的编程模型


线程的六种状态

状态 状态说明
NEW 初始状态,线程已经被构建,但是没有调用start()方法。
RUNNABLE 线程处于运行状态或者是可运行状态。
BLOCKED 阻塞状态,表示当前线程等待获取锁。
WAITING 等待状态,需要其他线程唤醒。
TIME_WAITING 超时等待状态,需要其他线程唤醒或者过了超时时间自动唤醒。
TERMINATED 终止状态,表示当前线程已经运行结束。

如何查看线程信息

​ jps:该命令可以获取进程id。

​ jstack:使用 jstack 进程id,可以查看线程的一些信息。


线程的初始化

private void init(ThreadGroup g, Runnable target, String name,
long stackSize, AccessControlContext acc,
boolean inheritThreadLocals) {
if (name == null) {
throw new NullPointerException("name cannot be null");
}
this.name = name;
// 创建的这个线程的父线程就是当前的这个线程
Thread parent = currentThread();
SecurityManager security = System.getSecurityManager();
if (g == null) {
if (security != null) {
g = security.getThreadGroup();
}
if (g == null) {
g = parent.getThreadGroup();
}
}
g.checkAccess();
if (security != null) {
if (isCCLOverridden(getClass())) {
security.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
}
}
g.addUnstarted();
// 设置当前线程的线程组信息
this.group = g;
// 将daemon priority设置为父线程的相关属性
this.daemon = parent.isDaemon();
this.priority = parent.getPriority();
if (security == null || isCCLOverridden(parent.getClass()))
this.contextClassLoader = parent.getContextClassLoader();
else
this.contextClassLoader = parent.contextClassLoader;
this.inheritedAccessControlContext =
acc != null ? acc : AccessController.getContext();
this.target = target;
setPriority(priority);
if (inheritThreadLocals && parent.inheritableThreadLocals != null)
this.inheritableThreadLocals =
ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);
this.stackSize = stackSize;
tid = nextThreadID();
}

如何优雅的终止线程

​ 使用volidate修饰的变量 中断线程interrupt()方法


在class所在目录下,使用javap -v HelloWorld.class指令可以查看该class的信息


管道输入输出流–>用于线程之间数据的传输,传输媒介为内存

​ PipedInputStream

​ PipedOutputStram

​ PipedReader

​ PipedWriter