1.线程:
a.由来:单任务OS —— 多任务OS
b.进程:每一个进程对应一个应用程序,分配独立内存空间
c.线程:线程是进程内部的一个独立的执行分支
d.特点:共享内容地址空间,切换成本更低
2.线程的创建和启动
a.方法一:(Thread)
①继承Thread类,重写run方法——run方法只负责确定这个线程要做的事情
public class MyThread extends Thread{ public void run() { } }
②开启线程,要调用start方法——该方法会为线程分配资源,然后自动调用this.run()
MyThread mt = new MyThread(); mt.start(); //开启线程
③如果调用run方法——不会报错,但只是普通的方法调用,没有开启新线程
b.方法二:(Runnable)
①实现Runnable接口,重写run方法——run方法只负责确定这个线程要做的事情
public class YourThread implements Runnable{ public void run() { } }
②创建一个Thread对象,把Runnable接口的实现类对象传入
调用Thread对象的start()
YourThread yt = new YourThread(); Thread th = new Thread(yt); th.start();
3.线程状态
a.流程:①新建状态(new Thread() 对象)——就绪状态(调用start(),但start()在调用run()之前)——运行状态(start(),调用run())——死亡状态(run()方法结束,进行资源回收清理)
②中断状态:在运行状态中,线程由于种种原因没有得到CPU执行
b.中断状态的五个原因:
①线程的优先级:线程优先级共十级,最高为10,最低为1
优先级高的只是被执行的几率更大,不代表完胜优先级低的
th.setPriority(10); th.setPriority(Thread.MAX_PRIORITY);
②阻塞:由于输入/输出,造成线程进行中断状态(如:Scanner)
③休眠:Thread的sleep方法
th.sleep(500); //传休眠的毫秒数
④等待 与 唤醒:Object 的 wait() 与 notify() 方法
⑤挂起:Thread 的 yield() 方法
4.同步锁
a.关键字:synchronized
b.意义:当多个线程访问同一资源的时候,有可能造成该资源数据混乱。
为保证该资源每次只能被一个线程使用,使用完以后再交给下一个线程,我们要使用同步技术。
c.同步的实现:
①同步方法:在资源身上加同步关键字synchronized
public synchronized void show(String name){ }
②同步块:在调用资源的线程身上使用synchronized
synchronized(this.rs){ this.rs.show(this.getName()); }