JAVA常用多线程知识大全(一)

一.  创建线程方法包括:

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()两个方法控制线程同步,前者尝试把元素放入阻塞队列,如果队列已满(初始化队列时需要指定队列容量),则阻塞当前线程;后者尝试从队列中取出头部元素,如果当前队列为空,则阻塞当前线程。

发布了30 篇原创文章 · 获赞 4 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章