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的静态方法

  1. 作用于当前线程
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() //使当前线程变为就绪状态, 所以也有可能下一个执行的线程仍然是当前线程
  1. 其他方法
//获取所有线程的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的对象方法

  1. 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()
  1. 用于改变线程状态
//*大概判断是否有权限操作该线程; 如果没有权限会抛出异常, 否则当作无事发生, 因此返回类型为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中的静态类和枚举类

  1. State
    一个枚举类, 表示进程的状态:
BLOCKED, 
NEW, 
RUNNABLE, 
TERMINATED, 
TIMED_WAITING,
WAITING

Thread.getState()方法返回该类型的某一个枚举值

  1. UncaughtExceptionHandler
    这是一个接口, 其中声明了一个方法
void uncaughtException(Thread t, Throwable e)

具体要怎么用, 什么时候会用到呢...

总结

  1. 概念的了解: thread group, stack size, classloader, 线程的状态等.
  2. 有关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的意义即可.

上一篇下一篇

猜你喜欢

热点阅读