建立线程:
public interface Runable{
void run();}
Lambda 建立实例:Runable r = ()->{ task code};
由Runable建立一个Thread对象:Thread r = new Thread(r);
启动线程:t.start();
中断线程:线程的中断状态是指线程具有的Boolean标志,当调用interrupt方法时,线程的中断状态将被置位。
弄清中断是否被置位的方法:调用静态的Thread.currentThread方法获得当前线程,然后调用isInterrupt方法,即:Thread.currentThread().isInterrupt();
当线程调用sleep或者wait方法时,线程进入堵塞状态,此时调用interrupt方法时,堵塞调用将被Interrupted Exception异常中断。
如果在中断状态被置位时调用sleep方法,它不会休眠,它将清除这一状态,并抛出Interrupted Exception异常,即sleep不会检测中断状态。
调用interreupted方法时,会改变线程的中断状态。(可以在捕获异常后设置中断状态)
也可以抛出InterruptedException异常,例如:
void Thread_text() throws InterruptedException
{ .......
sleep(delay);
......}
interrupt,interrupted,isInterrupted,currentThread.
线程被终止的原因:正常退出或出现异常而终止了程序的执行。
线程属性
线程属性包括:线程优先级,守护线程,线程组以及处理未捕获异常的处理器。
优先级设置:setPriority(int newPriority) 优先级在Thread.MIN_PRIORITY(1)与Thread.MAX_PRIORITY(10)之间,默认为NORM_PRIORITY(5)。
守护线程:为其他的线程提供服务。调用t.setDaemon(true)将线程转化为守护线程。
线程的run方法不能抛出任何受查异常,但是非受查异常会使线程中止,即线程死亡,这时异常被传递到一个未用于捕获异常的处理器。
线程的同步(竞争)
类似于操作系统中的锁机制。ReentrantLock保护代码块的基本结构:
myLock.lock();
try{
critical section;(临界区)
}
finally{
myLock.unlock();
条件对象:管理那些已经进入被保护的代码段但还不能运行的线程。
Condition newContidion():返回一个与该锁相关的条件变量
void await():将该线程放到条件的等待集中。
void signal():随机解除一个线程的堵塞状态。
void signalALL():解除该条件的等待集中所有的线程的堵塞状态。
public synchronized void method(){......}
等价于public void method(){
this.intrinsiclock.lock();
try
{......}
finally {this.intrinsiclock.unlock();}
}只有一个对象变量。wait,notify,notifyAll。
tryLock方法。Lock方法不能被中断。
读写锁:
(1)构造一个ReentrantReadWriterLock对象。
(2)抽取读锁和写锁。
(3)对所有获取方法加读锁,对所有修改方法加写锁。
线程池:包含很多准备运行的空闲线程。