一,线程概述java
1.进程:正在运行的程序安全
2.线程:进程中同时运行的多个执行单元多线程
关键字:共享资源,spa
3.多线程可使:多段程序代码交替运行(一段程序代码能够看作一个线程任务)线程
二,线程的建立code
1.继承Thread类,重写run()方法对象
(1)建立代码blog
MyThread thread1=new MyThread(“thread1”); MyThread thread2=new MyThread(“thread2”);
2.实现Runnable接口,重写run()方法继承
(1)建立代码接口
MyThread myThread=new MyThread(); //多了步建立继承类的实例对象 Thread thread1=new Thread(myThread,“thread1”); Thread thread2=new Thread(myThread,“thread2”);
3.实现Callable接口,重写call()方法,并使用Future来获取call()方法的返回结果
(1)建立代码
MyThread myThread=new MyThread(); FutureTask ft1=new FutureTask(myThread); //多了部包装 Thread thread1=new Thread(ft1,“thread1”); FutureTask ft2=new FutureTask(myThread); Thread thread2=new Thread(ft2,“thread2”);
三种实现方法对比:
(2)每种方法都比前一种多了一步
(2)实现Runnable或Callable 适合多个线程去处理同一个共享资源的状况,将线程同程序代码、数据有效分离
继承Thread没法资源共享。故只能建立一个售票程序,而后开启多个线程去共享同一个售票对象的售票方法,即让4个线程运行同一个售票程序
(3)避免java单继承带来的局限性
三.线程的生命周期及状态转换
四.线程的调度
1.定义:java虚拟机为线程分配CPU的使用权
2.分时调度模型/抢占式调度模型。java虚拟机默认采用抢占式调度模型
3.线程的优先级
(1)优先级越高得到CPU的机会越大
4.线程休眠 Thread.sleep(long millis)
(1)定义:使正在执行的线程暂停,把CPU让给其余线程
(2)Running--->Timed_Wating--->Ready 休眠时间完了才会进入Ready状态,才有机会得到CPU
5.线程让步 Thread.yield()
(1)与线程休眠的区别:不会阻塞该线程,只是将线程直接转换到Ready状态,让系统的调度器从新调度
6.线程插队 thread2.join()
五.多线程同步
(多线程去访问同一个资源,也会引起一些安全问题)
(前面经过实现Runnable接口的方式,并不能彻底解决线程同步问题)
定义:为了解决线程安全问题,限制某个资源在同一时刻只能被一个线程访问
1.线程安全
解决:处理共享资源的代码在任意时刻只能有一个线程访问
2.同步代码块 synchronized(lock)
3.同步方法 修饰符synchronized
4.同步锁 Lock lock(lock.lock(),lock.unlock())
5.死锁问题
六.多线程通讯 wait()/notify(),notifyAll()
(1)wait() 使当前线程进入等待状态
notify()/notifyAll() 唤醒当前处于等待状态的线程
七.线程池
续:
1.wait和sleep的区别
(1).调用wait()方法会释放对象的锁。所以wait方法通常被用于同步方法或者同步代码块中
(2).与wait方法不一样的是,sleep方法不会释放当前占有的锁
2.多线程中,为了保证数据的一致性,一般须要在使用对象或者方法前加锁
3.同步块是访问共享资源的代码块。给共享资源上了个锁