Java8 API学习24 - java.lang.Runnab
2018-07-08 本文已影响0人
raBBtt
接下来的几篇文章会说明一下和多线程有关的东西
Runnable
public interface Runnable {
public void run();
}
显然Runnable可以作为一个函数式接口.
Thread
public class Thread implements Runnable
Thread的常量和静态方法
Thread类中有3个常量, 可以简单地用来表示线程的优先级
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;
Thread的静态方法
- 作用于当前线程
native Thread currentThread() //返回当前线程
native boolean holdsLock(Object obj) //判断给obj加锁的是不是当前线程
/*判断当前线程是否为中断状态, 但是调用后会清除中断;
这样设计可以用来做线程的中断处理*/
boolean interrupted()
native void sleep(long millis) throws InterruptedException
void sleep(long millis, int nanos) throws InterruptedException
native void yield() //使当前线程变为就绪状态, 所以也有可能下一个执行的线程仍然是当前线程
- 其他方法
//获取所有线程的StackTrace
Map<Thread, StackTraceElement[]> getAllStackTraces()
int activeCount() //返回所属线程组里所有活动线程的个数
int enumerate(Thread[]) //返回上述活动线程构成的一个数组
void dumpStack() //打印当前线程的的StackTrace, used only for debugging
//*?
Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()
void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)
这几个方法中, 和线程组有关的都是通过调用Thread.currentThread().getThreadGroup()
实现的.
Thread的构造方法
//空线程, 好像什么也干不了?
Thread()
Thread(String)
Thread(ThreadGroup, String)
//传入Runnable
Thread(Runnable)
Thread(Runnable, String) //并设置线程名称
Thread(ThreadGroup, Runnable) //把线程添加到一个线程组内
Thread(ThreadGroup, Runnable, String)
//最后一个参数设置线程的堆栈大小, 默认为0, 但是单位是什么也没说啊, 是字节吗
Thread(ThreadGroup, Runnable, String, long)
Thread的对象方法
- get/set/is方法, 用于判断或设置状态
//*?
ClassLoader getContextClassLoader()
void setContextClassLoader(ClassLoader)
long getId() //当前程序内的线程id, 比如main通常为1
final String getName()
final void setName(String)
final int getPriority()
final void setPriority(int)
StackTraceElement[] getStackTrace()
Thread.State getState() //Thread.State在本文后面有说明, 代表线程的状态
final ThreadGroup getThreadGroup()
Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()
void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)
//设置线程为守护线程, 只有在线程start之前才能设置
void setDaemon(boolean)
final boolean isDaemon()
native final boolean isAlive()
//判断线程是否中断, 但是和Thread.interrupted()不同, 不会改变中断状态
boolean isInterrupted()
- 用于改变线程状态
//*大概判断是否有权限操作该线程; 如果没有权限会抛出异常, 否则当作无事发生, 因此返回类型为void
final void checkAccess()
void interrupt() //手动中断线程
//Waits for this thread to die.
void join() throws InterruptedException
final void join(long) throws InterruptedException
final void join(long millis, int nanos) throws InterruptedException
void run() //如果只调用run不调用start, 只是相当于在原线程执行了一个方法
void start() //启动线程, 实际上是调用了一个native方法
String toString()
Thread中的静态类和枚举类
- State
一个枚举类, 表示进程的状态:
BLOCKED,
NEW,
RUNNABLE,
TERMINATED,
TIMED_WAITING,
WAITING
Thread.getState()
方法返回该类型的某一个枚举值
- UncaughtExceptionHandler
这是一个接口, 其中声明了一个方法
void uncaughtException(Thread t, Throwable e)
具体要怎么用, 什么时候会用到呢...
总结
- 概念的了解: thread group, stack size, classloader, 线程的状态等.
- 有关ThreadGroup, 本来是打算在也说明一下这个类, 但是发现自己对这个概念也没什么了解, 所以就此打住吧.
ThreadLocal<T>
public class ThreadLocal<T>
ThreadLocal可以认为是线程的局部变量, 即变量的内容在每个线程中都是独立的, ThreadLocal通过一个map存储变量和线程的对应关系. (并不是通常的某种map类型, 是ThreadLocal中的一个非public的静态类, 叫作ThreadLocalMap)
不过又看到一篇文章里面说: 在JDK8中, ThreadLocal的设计是: 每个Thread维护一个ThreadLocalMap哈希表,这个哈希表的key是ThreadLocal实例本身,value才是真正要存储的值Object。
ThreadLocal<T>的方法
/*给ThreadLocal变量一个初始值. 例:
ThreadLocal<String> tl = ThreadLocal.withInitial(String::new)*/
static ThreadLocal<S> withInitial(Supplier<? extends S>)
//构造方法
ThreadLocal()
T get()
void set()
void remove()
可以看到其实方法没有什么可多说的, 只要理解ThreadLocal的意义即可.