一. 创建线程方法包括:
1. 继承Thread创建后调用start()方法启动;
2. 实现runnable接口后作为Thread的target创建,调用Thread的start()方法启动;
3.实现Callable<>接口作为Future<>的target创建,调用Future<>的Start()方法启动线程,后续可以调用get()方法获取Callable<>返回值(该方法会阻塞当前线程)
二. 控制线程:
1. Thread的join()方法可以让当前线程阻塞直被join()的线程执行完毕,支持join(long millis)指定最大等待时间;
2. 调用Thread的setDaemon(true)可以将线程设置为后台线程,后台线程将在所有非后台线程死亡后自动死亡;
3. 调用 Thread的sleep(long millis)可以让当前线程被阻塞指定时间长度;
4. 调用Thread的yield()方法会将当前线程转入就绪(非阻塞)状态,线程调度器会重新调度(该线程也有可能被调度器重启启动)5. 调用Thread的setPriority(int newPriority)和getPriority()方法可以设置和获取指定线程的优先级,高优先级线程有较多的机会被执行。
三. 线程同步:
1. 使用synchronized(obj){...}可以同步代码块,obj就是同步监视器;
2. 使用synchronized可以同步非static方法,无须显式指定监视器,采用this作为监视器;
3. 同步方法和同步代码块执行完毕、抛出异常、执行了同步检视对象的wait()会释放同步监视器,调用sleep()和yield()不会释放同步监视器;
4. 使用Lock可以实现比synchronized更灵活的同步控制,常用的是ReentrantLock类,使用该类的lock()和unlock()方法实现;
四. 线程通信
1. wait() / notify() / notifyAll(),用于使用了相同监视对象的线程进行同步。意义分别为导致当前线程等待(可设置最长等待时间),随机唤醒单个等待线程,唤醒所有等待线程,要注意对于使用synchronized修饰的同步方法,this就是同步监视器,可以直接调用这几个方法,如果是synchronized修饰同步代码块,同步监视器是synchronized括号里面的对象,必须使用这个对象的这几个方法。注意一点这几个方法只是程序阻塞和继续,跟synchronized和lock控制的线程阻塞,死锁等有区别;
2. Condition控制线程通信,对于使用lock而非synchronized来保证同步的程序,使用Lock对象的new Condition()方法可以获取Condition对象,该对象有await() / signal() / signalAll() 方法,功能和上面的 wait() / notify() / notifyAll()类似
3. 阻塞队列(BlockingQueue)控制线程队列,BlockingQueue主要用来控制线程同步,实现类有ArrayBlockingQueue, LinkedBlockingQueue等,提供put(E e)和take()两个方法控制线程同步,前者尝试把元素放入阻塞队列,如果队列已满(初始化队列时需要指定队列容量),则阻塞当前线程;后者尝试从队列中取出头部元素,如果当前队列为空,则阻塞当前线程。