美文网首页
Java8 API学习24 - java.lang.Runnab

Java8 API学习24 - java.lang.Runnab

作者: raBBtt | 来源:发表于2018-07-08 15:28 被阅读0次

    接下来的几篇文章会说明一下和多线程有关的东西

    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的意义即可.

    相关文章

      网友评论

          本文标题:Java8 API学习24 - java.lang.Runnab

          本文链接:https://www.haomeiwen.com/subject/wooguftx.html