线程
线程是一个程序内部的顺序控制流。
创建线程:
1.定义线程类并实现Runnable接口:(较好,更灵活)
class Runner implements Runnable{...};
Runner target = new Runner();
Thread myThread = new Thread(target); target为runnable接口类型。
Runnable只有一个run()方法
2.定义Thread的子类并重写run()方法。
启动线程:
start()方法启动线程。
如果使用run()方法,则是普通的方法调用。
即start()方法启动线程,子线程和主线程并行运行(轮流执行一部分),run()方法则阻塞运行。
sleep():让出cpu一定时间。
join():合并线程,即子线程变成方法调用。
yield():让出cpu一次。
线程同步:协调多个线程访问同一份资源。
使用synchronized(this){...}包含那个资源。
资源前加synchronized修饰。
synchronized:锁定。
线程死锁:
1锁a,sleep,需要锁b
2锁b,sleep,需要锁a
构成死锁。
解决死锁:
把锁的粒度加粗,锁定更大对象。
wait()和sleep()的不同:
wait()是Object的方法,sleep()是Thread的方法,wait时,别的线程可以访问锁定对象,调用wait方法必须先锁定对象。sleep时,别的线程不可以访问锁定对象。
notify/notifyAll:
唤醒wait的线程。