1.程序,进程,线程
程序:一组能完成一定任务的文件,是静止的
进程:程序运行之后至少会启动一个进程,是一个动态变化的
一个程序可以启动多个进程
多进程会消耗更多的系统资源
每一个进程都独占一块内存,进程之间通信开销大
线程:线程是进程内部的运行单元
一个进程可以包含多个线程,至少包含一个线程
每一个线程有独立的内存空间,多个线程之间可以通过进程的内存进行通信
2.如何实现多线程编程
a.通继承Thread实现多线程
b.实现Runnable接口
c.通过定时器创建线程:TimerTask 定时任务
d.Callable
3.Thread和Runnable的区别
Thread对象是一个线程对象,可以直接并行运行
Runnable对象只是一个可并行的任务,不能够直接并行运行,需要将其包装成Thread对象
4.线程的常用方法
Thread th = Thread.currentThread(); 获得当前线程对象
String name = th.getName(); 获得线程的名字
String id = th.getID(); 获得线程的标识符
5.问题:
a.多个线程共用同一个变量,为什么用基本类型不可以通过构造方法传递?
b.为什么会出现不同的结果?
6.线程的几种状态、线程的生命周期
New Thread 新建状态 :创建了线程对象,调用start之前
Runnable 就绪状态[可运行状态] 调用了start之后,run方法执行之前
Running 运行状态 run方法正在执行
Not Run 阻塞状态[挂起] 线程sleep,wait的时候
Dead 死亡状态 run正常结束或者进程终止
作业:
1.完成以上1到6点的总结
文字描述+代码示例/画图说明
2.使用多线程完成一个文件的复制
====================================================
7.线程池
线程池的四种创建方式及用法:
//创建一个存放单一线程的线程池
//ExecutorService service = Executors.newSingleThreadExecutor();
//创建固定线程数量的线程池
//ExecutorService service = Executors.newFixedThreadPool(2);
//创建一个可缓存线程对象的线程池
//ExecutorService service = Executors.newCachedThreadPool();
//创建一个可延时执行的线程池,
ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
测试代码:
MyRunnable mr = new MyRunnable();
// service.execute(mr);
// service.execute(mr);
service.execute(mr);
service.schedule(mr, 2, TimeUnit.SECONDS);
--------------------------------
任务:
1.修改完成多线程文件复制
2.完成今天的知识点总结
===================================================================
8.线程的常用方法
//设置和获得线程优先级的方法
//线程的优先级从1到10,默认值是5
setPriority(int newPriority);
getPriority();
//线程休眠的方法
sleep(long millis);
//等待该线程先执行完毕
join();
//暂停当前正在执行的线程,去执行其他线程
yield();
//中断线程,中断线程会抛出线程中断的异常
interrupt();
//设置守护线程
setDaemon(true);
----------------------------------------------------------------------------
9.线程的同步
线程的执行默认是异步的:
多个线程可以同时访问同一个数据[同一块内存]
同步:在同一个时间只能有一个线程访问这个数据
如何实现线程同步:
1.使用同步代码块
synchronized(对象){
需要同步的代码
}
2.使用同步方法
public synchronized void method(){
}
3.使用同步锁
Lock lo = new ReentrantLock();
lo.lock();//上锁
lo.unlock(); //解锁
4.使用本地变量
使用ThreadLocal存放变量
-------------------------------------------------------
作业:
1.总结:
线程常用方法有哪些?用途是什么
线程的优先级
什么是守护线程,如何实现守护线程,有什么意义?
什么是线程同步?如何实现线程同步?
2.线程同步的案例
3.线程的通信
---------------------------------------------------------
10. 生产消费者模型
wait notify机制
wait()
notify()
notidyAll()
wait和sleep的区别:
wait和sleep都是让当前线程进入阻塞状态
wait方法是Object类中的方法
sleep是Thread类的方法
当线程在wait的时候,会释放线程占用的资源
线程sleep的时候,会继续占用资源
notify与notifyAll的区别:
notify随机唤醒在同一个对象上wait的线程
notifyAll唤醒所有在这个对象上wait的线程
-----------------------------------------------
扩展:
使用阻塞队列实现生产消费模型
LinkedBlockingQueue