为什么需要多线程?
提高cpu的利用效率,从而提高多个程序的运行速度。
多线程通过轮换的方式在单机系统中同时运行。
实现了Runnable接口类的实例都被称作可运行对象。
线程是Thread。
任务类只需要实现Runnable接口并重写其中的run方法
class A implements Runnnable{
public void run(){
}
}
new Thread(new A());
30.4
将start换成run,就等于没有启用多线程,只是调用了三个run方法,这个时候程序不具备有多线程的特性,只会依次执行。
调用了Thread中的start方法后,会转而以多线程的方式执行run。但是千万不要手工调用run,那样就成了普通的单线程。
不要依赖线程的优先级来确定那个线程可能会先执行。线程的优先级只是一个建议,而最终决定权实际上是在os手里。OS是线程。
线程同步:让多线程程序按照我们的要求有序配合执行,说的简单一点就是我们要控制多个线程的执行顺序。
临界资源:多个线程会同时操作的存储单元。比如变量。
临界区:操作临界资源的那一段代码。
正是因为有多个线程同时操纵临界资源,才会导致临界资源中的数据出现问题。
解决多线程运行时错乱的方法就是保护好临界资源,也可以说控制好临界区。
synchronized关键字用来说明这个方法在同一时刻只能被一个线程执行访问。
监视器:监视器是一个对象。任何对象都可以成为监视器。
一旦一个线程锁住对象。这个对象就成为了一个监视器。
Object o = new Object();
synchronized(o){
}
synchronized void f(){//此时synchronized的监视对象就是this
}
监视器拿来干什么的?拿来挂锁的。
如果使用手工锁,那么锁上的条件要使用await(),signal(),signal All()来完成。
如果使用synchronized,这是锁是自动加上和解锁的,当使用条件的时候就要使用wait(),notify(),notify
All()来完成。
如果只需要为一个任务创建一个线程,就用Thread类,
如果需要为多个任务创建线程,最好使用线程池。
创建线程池