在学习之前我们应该先弄清几个概念:进程,线程,任务和执行器,由于我没读过专业的书籍只能根据我的理解简单介绍一下,但入门也足够了
进程
进程就是应用程序,一个应用程序就是一个进程
打开任务管理器可以看到
线程
线程就是一个进程里通向cpu的线路,以我们电脑管家为例,可以同时进行优化,垃圾清理等等,但是有时候它会显示安全监测不能和垃圾清理同时进行,就说明这个进程的线程用完了。在程序运行时即使我们没有创建线程也会有线程存在,比如main(主)线程、垃圾回收线程。
任务
任务就是在线程中执行的任务
调度器
在一个进程中。如果开辟了多个线程,线程的运行调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能认为干预的
调度器就是自动管理线程的工具,不用我们亲自建立关闭线程
在java中万物皆对象,以上所述也不例外,进程就是一个java程序,线程用Thread实现,任务用Runnable类实现,执行器用Executor类实现,我们只要掌握了这几个类就算是入门了
继承Thread类
1、继承Thread类
2、重写run()方法
3、创建对象调用start()方法
实现Runnable接口
1、实现Runnable接口
2、重写run()方法
3、创建thread对象调用start()方法
NEW新生状态
线程创建完成就进入了新生状态
就绪状态
当调用start方法时就进入了就绪状态,但不意味着立即执行
RUNNABLE运行状态
线程真正执行代码块,运行有两种结果一个就是阻塞另一个就是终止
BLOCKED阻塞状态
当调用sleep、join、wait或同步锁时,线程就进入了阻塞状态,就是代码不往下执行,阻塞事件解除后,重新进入就绪状态
TERMINATED 终止状态
线程中断或结束,一旦进入死亡状态就不能再次开启或执行
WAITING
正在等待另一个线程执行特定动作的线程处于此状态。
TIMED_WAITING
正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。
获取线程状态
Thread.State getState()
返回此线程的状态。
static int MAX_PRIORITY
最高(10)
static int MIN_PRIORITY
最低(1)
static int NORM_PRIORITY
默认(5)
设置获取线程优先级
优先级请在run方法中设置,优先级高的不一定先执行
int getPriority()
void setPriority(int newPriority)
public void start()
:导致此线程开始执行;Java虚拟机调用此线程的run方法。
public static void sleep(long millis)
:使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)
每个线程都有一把锁sleep不会释放锁
public static Thread currentThread()
:返回对当前正在执行的线程对象的引用
让当前线程先执行,其他线程处于阻塞状态
void join()
让当前线程停止转为就绪状态但是不阻塞,礼让不一定成功。
static void yield()
虚拟机只需等待用户线程结束之后就关闭程序,不用等着后台线程结束
void setDaemon(boolean on)
boolean isDaemon()
自己设置中断标志停止线程
boolean isAlive()
当一个线程获得对象的排它锁,独占资源,其他线程必须等待,使用完成释放锁。
同步方法
默认锁住this
同步块
synchronized(Object obj)
{}
static方法
默认锁住Class
void wait()
导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法。
void wait(long timeout)
导致当前线程等待,直到另一个线程调用 notify()方法或该对象的 notifyAll()方法,或者指定的时间已过。
void notify()
唤醒正在等待对象监视器的单个线程。
void notifyAll()
唤醒正在等待对象监视器的所有线程。
解决集合类线程不安全问题方法就是使用collections的静态方法创建集合
static List< T> synchronizedList(List< T> list)
返回由指定列表支持的同步(线程安全)列表。
static synchronizedMap(Map
返回由指定地图支持的同步(线程安全)映射。
static < T> Set synchronizedSet(Set< T> s)
返回由指定集合支持的同步(线程安全)集。
他与runnable的最大区别就是他可以有返回值并且可以抛出异常
1、实现callable接口
2、重写call()方法
3、new FutureTask(Callable callable) 进行衔接
4、创建thread对象调用start()方法
获取返回值
Futrue.get()
1、结果会被缓存
2、可能会有阻塞
void execute(Runnable command)
执行任务,没有返回值
< T>Future< T> submit(Callable command)
执行任务有返回值
void shutdown()
关闭线程池
线程池的工具类,用于创建并返回不同类型的线程池
static ExecutorService newSingleThreadExecutor()
创建一个单个线程
static ExecutorService newFixedThreadPool(int nThreads)
床加一个固定大小的线程池
static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
创建一个可伸缩的线程池
只要有synchronized那么效率就会低
void lock()
获得锁。
void unlock()
尝试释放此锁。
boolean tryLock()
只有在调用时它不被另一个线程占用才能获取锁。
Condition newCondition()
返回Condition用于这种用途实例Lock实例。
A ReadWriteLock维护一对关联的locks ,一个用于只读操作,一个用于写入。 read lock可以由多个阅读器线程同时进行,只要没有作者。 write lock是独家的。
可以定义多个Condition分别监视
void await()
导致当前线程等到发信号或 interrupted 。
void signal()
唤醒一个等待线程。
DAYS
时间单位代表二十四小时
HOURS
时间单位代表六十分钟
MICROSECONDS
时间单位代表千分之一毫秒
MILLISECONDS
时间单位为千分之一秒
MINUTES
时间单位代表60秒
NANOSECONDS
时间单位代表千分之一千分之一
SECONDS
时间单位代表一秒
void sleep(long timeout)
使用此时间单位执行 Thread.sleep 。
void timedJoin(Thread thread, long timeout)
使用此时间单位执行定时 Thread.join 。
CopyOnWriteArraySet< E>类
CopyOnWriteArraySet< E>类
ConcurrentHashMap< K,V>类
线程减法计数器
void countDown()
减少锁存器的计数,如果计数达到零,释放所有等待的线程。
void await()
等待计数器归零,然后再向下执行
线程加法计数器
CyclicBarrier(int parties, Runnable barrierAction)
创建一个新的 CyclicBarrier ,当给定数量的线程(线程)等待时,它将跳闸,当屏障跳闸时执行给定的屏障动作,由最后一个进入屏障的线程执行。
int await()
等待所有 parties已经在这个障碍上调用了 await 。