• Java-Thread


    1. 线程的创建和启动

    1.1 继承Thread

      在run方法里,通过this获取当前线程。

      多个线程不能共享实例变量。

    1.2 通过实现接口

    1.2.1 实现Runable接口

      在run方法里,只能通过Thread.currentThread()获取当前线程。

      多个线程可以共享实例变量。

    1.2.2 使用Callable和Future

    call()方法比run()方法更强大:

      1. call()方法可以有返回值。

      2. call()方法可以声明抛出异常。

    注意:

    1. Callable对象不能直接作为Thread的target
    2. FutureTask类实现了Future接口和Runable接口,可以作为Thread的target

    2. 线程的生命周期

    1. new  new一个thread
    2. ready  调用start()
    3. run
    4. blocked
    5. terminated
      1. run()或call()方法正常结束
      2. 线程抛出Exception或Error
      3. 直接调用线程的stop()——容易导致死锁

    当主线程结束时,其他线程不会受到影响,并不会随之结束。一旦子线程启动起来后,它就有和主线程相同的地位,它不会受主线程的影响。

    3. 线程控制

    3.1 join线程

    调用者被阻塞,知道被调用线程执行完,调用者才会继续执行。

    public class JoinThread extends Thread{
        
        public JoinThread(String name){
            super(name);
        }
    
        public void run(){
            for(int i=0;i<100;i++){
                System.out.println(getName() + " " + i);
            }
        }
        public static void main(String[] args) throws Exception {
            new JoinThread("新线程").start();
            for(int i=0;i<100;i++){
                if(i == 20){
                    JoinThread jt = new JoinThread("被join的线程");
                    jt.start();
                    //main线程调用了jt线程的join()方法,main线程必须等待
                    //jt执行结束之后才会向下执行
                    jt.join();
                }
                System.out.println(Thread.currentThread().getName() + " " + i);
            }
        }
    }
    View Code

    3.2 后台线程

    如果所有前台线程死亡,后台线程自动死亡。

    前台线程创建的子线程,默认是前台线程。后台线程创建的子线程,默认是后台线程。

    1 JoinThread jt = new JoinThread("被join的线程");
    2 jt.setDaemon(true);
    3 jt.start();
    View Code

    3.3 线程睡眠

    Thread.sleep(3000);

    3.4 线程让步

    Thread.yield();

    3.5 改变线程优先级

     Thread.setPriority();

    4. 线程同步

    4.1 同步块synchronized statements

    4.2 同步方法synchronized methods 

      单线程:StringBuilder

      多线程:StringBuffer

    同步方法,只对同一实例有效果,同一个类的不同实例的同一方法,是没有作用的。

    4.3 同步监视器的释放

    1. 释放
      1. 当前线程的同步代码块和同步方法执行结束
      2. 当前线程,遇到了break、return终止了同步代码块和同步方法的执行
      3. 当前线程执行时,遇到了Error或Exception,异常结束时
      4. 当前线程执行同步代码块或同步方法时,程序调用了同步监视器的wait()方法
    2. 不释放
      1. 程序调用Thread.sleep()、Thread.yield()
      2. 其他线程调用当前线程的suspend()方法将当前线程挂起

    4.4 同步锁

    根接口:Lock、ReadWriteLock

    实现类:ReentrantLock、ReentrantReadWriteLock、StampedLock

    4.5 死锁

    java虚拟机不检测死锁,也没有措施

    5. 线程通信

    5.1 传统

    1. wait()
    2. notify()
    3. notifyAll()

    5.2 Lock and Condition

    private final Lock lock = new ReentrantLock();
    private final Condition cond = lock.newCondition();
    ...
    cond.await();
    cond.signal();
    cond.signalAll();
    View Code

    5.3 BlockingQueue

    6. 线程组

    ThreadGroup

    7. 线程池

    1. Executors
    2. ForkJoinPool

    8. 线程相关类

    8.1 ThreadLocal类

    复制资源,不同的线程拥有不同的副本。

    8.2 包装线程不安全的集合

    HashMap m = Collections.synchronizedMap(new HashMap());

    8.3 线程安全的集合

    在java.util.concurrent包下

    1. Concurrent开头
      1. ConcurrentHashMap
      2. ConcurrentSkipListMap
      3. ConcurrentSkipListSet
      4. ConcurrentLinkedQueue
      5. ConcurrentLinkedDeque
    2. CopyOnWtrite开头
      1. CopyOnWriteArrayList
      2. CopyOnWriteArrayset
  • 相关阅读:
    各类免费资料及书籍索引大全(珍藏版)
    转—如何写一篇好的技术博客
    如何写技术博客
    Spring + Spring MVC + Mybatis 框架整合
    Httpclient 4.5.2 请求http、https和proxy
    HttpClient4.5.2 连接池原理及注意事项
    php加密数字字符串,使用凯撒密码原理
    php 阿里云视频点播事件回调post获取不到参数
    Nginx代理后服务端使用remote_addr获取真实IP
    记录:mac的浏览器访问任何域名、网址都跳转到本地127.0.0.1或固定网址
  • 原文地址:https://www.cnblogs.com/zhouj-happy/p/5832571.html
Copyright © 2020-2023  润新知